我正在使用 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/