windows - Gradle docker插件绑定(bind)windows主机共享

标签 windows docker gradle

我正在使用 https://github.com/bmuschko/gradle-docker-plugin用于从 gradle 连接到 docker。我有以下任务在 Windows 上创建容器:

task "docker-container-create"(type: DockerCreateContainer) {
    description = "Create Docker container"
    group "${dockerGroup}-container"

    ext {
        dockerTag = project.dockerTag 
    }

    targetImageId { "${dockerRepository}:${project.dockerTag}" as String }
    delegate.containerName = containerName

    portBindings = ["80:${project.dockerExposedPort}"]

    env = ["GRAILS_ENV=development"]
    cmd = ["--app.dockerContainerName=${containerName}"]

    if(!new File("${project.projectDir}/data").exists()) new File("${project.projectDir}/data").mkdirs()

    binds [
        ("${project.projectDir}/data" as String):'/app/data',
        ("${project.projectDir}/src/main/config/" as String):'/app/config',
    ]
}

但这失败并出现以下错误:
{"message":"invalid volume specification: '/host_mnt/c/Users/**/parts/data:rw'"}

我正在运行 Docker 版本 17.12.0-ce-win47 (15139)-stable

最佳答案

显然,windows 挂载点应该以 //C/<folder> 的形式定义。如该版本的发行说明中所述:

Fix Mount compatibility when mounting drives with `-v //c/...`, now mounted in /host_mnt/c in the LinuxKit VM. Fixes [docker/for-win#1509](https://github.com/docker/for-win/issues/1509), [docker/for-win#1516](https://github.com/docker/for-win/issues/1516), 

我在 gradle 构建文件中创建了一个小型辅助实用程序:
    def volumes = {volumes -> volumes.collectEntries{k,v ->
        if(k.contains('\\')){
            k = "//${k.replaceAll('\\\\','/')}"
            k = k.replaceAll(':','')
        }
        [(k):v]
    }}

所以配置现在显示为:
task "docker-container-create"(type: DockerCreateContainer) {
    description = "Create Docker container"
    group "${dockerGroup}-container"

    ext {
        dockerTag = project.dockerTag 
    }

    targetImageId { "${dockerRepository}:${project.dockerTag}" as String }
    delegate.containerName = containerName

    portBindings = ["80:${project.dockerExposedPort}"]

    env = ["GRAILS_ENV=development"]
    cmd = ["--app.dockerContainerName=${containerName}"]

    if(!new File("${project.projectDir}/data").exists()) new File("${project.projectDir}/data").mkdirs()

    def volumes = {volumes -> volumes.collectEntries{k,v ->
        if(k.contains('\\')){
            k = "//${k.replaceAll('\\\\','/')}"
            k = k.replaceAll(':','')
        }
        [(k):v]
    }}

    binds = volumes([
        ("${project.projectDir}/data" as String):'/app/data',
        ("${project.projectDir}/src/main/config/" as String):'/app/config',
    ])
}

这行得通。

关于windows - Gradle docker插件绑定(bind)windows主机共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48923612/

相关文章:

gradle - 错误:Gradle:执行失败 “Running/Applications/Android Studio.app/sdk/build-tools/android-4.2.2/aapt failed”

java - 通过 gradle 为 spring boot 应用构建 docker 镜像时的最佳实践

windows - 如何在 Windows 中卸载 Google Cloud SDK

windows - 使用 Perl 轮询进程退出

windows - Powershell 快捷方式创建不起作用

docker - Kubernetes 从私有(private)注册表中提取图像失败 --> 未知字段 "imagePullPolicy"

postgresql - 如何使用 docker-compose up-down-up 进行持久存储?

android - com.android.tools.build :aapt2:4. 0.0-alpha09-6051327 没有缓存版本可用于离线模式。安卓 4.0 金丝雀 9

java - 在 linux 上部署时出现 NoSuchMethodError

python - 打包在 requirements.txt 中,但在 docker 中看不到