Windows上的Docker:失败:container_linux.go:344:启动容器进程导致“ exec:\”。/gradlew \”:stat。/gradlew:没有此类文件或目录”

时间:2019-03-18 09:26:10

标签: windows docker

在网上进行初始解决方案搜索后,这是原始命令。我徒然尝试了使用斜杠(/)的各种组合:

winpty docker run --privileged --rm -it -v '//c//temp//git//distributions//cache://root//.gradle' --mount type=bind,source=//c//temp//git//distributions,target=//distdestiny_server.in.systems.com/x86/p83-buildenv './gradlew'
C:/Program Files/Docker Toolbox/docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused "exec: \"./gradlew\": stat ./gradlew: no such file or directory": unknown.

在网上进一步搜索后,我使用了具有各种组合的绑定安装和传播选项,但最终出现此错误:

winpty docker run --privileged --rm -it --mount type=bind,source=//c//temp//git//distributions//cache,target=//root//.gradle --mount type=bind,source=//c//temp//git//distributions,target=/dist,bind-propagation=shared destiny_server.in.systems.com/x86/p83-buildenv './gradlew'
C:/Program Files/Docker Toolbox/docker.exe: Error response from daemon: linux mounts: path /c/temp/git/distributions is mounted on / but it is not a shared mount.

我遇到的另一个选择是MountFlags。但是,码头工人文档仅提及它,但没有说明在何处指定。我找不到在cmd上指定它的方法。线。我在网上找到了对某些文件的引用,例如Dockerfile,docer.service等。但是,我在系统上找不到任何这些文件。我是否应该创建群以获取这些文件?我唯一的最后一个选择是使用MountFlags,但不知道如何以及在哪里指定它。

Docker详细信息:在我键入此内容时,我刚刚将台式机上的Docker Client从17.07.0-ce升级到了18.03.0-ce。我仍然有相同的问题报告。

从Docker快速入门终端:

$ docker version
Client:
 Version:       18.03.0-ce
 API version:   1.37
 Go version:    go1.9.4
 Git commit:    0520e24302
 Built: Fri Mar 23 08:31:36 2018
 OS/Arch:       windows/amd64
 Experimental:  false
 Orchestrator:  swarm

Server: Docker Engine - Community
 Engine:
  Version:      18.09.3
  API version:  1.39 (minimum version 1.12)
  Go version:   go1.10.8
  Git commit:   774a1f4
  Built:        Thu Feb 28 06:40:51 2019
  OS/Arch:      linux/amd64
  Experimental: false

在这方面的任何帮助都是很有帮助的。谢谢。

1 个答案:

答案 0 :(得分:0)

在Windows上使用docker充满了与路径有关的问题。看来您跌倒了其中一个兔子洞。假设.gradle是一个目录(它在我的机器上):

我解决此问题的方法是使用docker卷:卷与您当前正在使用的驱动器映射不同,因为文件不会出现在主机文件系统上,但是它们在容器执行期间是持久的,通常就足够了。例如,我所有开发工具中的一个卷都挂载了一个/git目录,该目录使用该目录来获取从git克隆的源代码。如果您需要在docker外部访问这些文件,那么卷可能会很尴尬,但是如果您仅在容器内使用gradle而从未在主机上使用过gradle,则可以将.gradle目录映射到一个卷,并在不同容器之间重复使用

但是,在执行此操作之前,最好使用以下命令显式创建卷:

 docker volume create gradle

有各种各样的技术可以隐式地创建体积,但是就我个人而言,由于最不令人惊讶的原理,我想明确一些。

安装该卷的语法与您上面使用的语法相似,但是我们只是在音量开关的左侧命名该卷:

docker container run -it --rm -v gradle:/root/.gradle/ ...

不过,您的docker run命令中可能还有另一个问题。最后,您传递字符串'./gradlew'。您假设它在工作目录中,如果工作目录不是您认为的那样,则可能会出现问题。为了确保不会发生这种情况,您应该使用-w <dir>开关声明工作目录。像这样:

docker container run -it --rm -w /root /v gradle:/root/.gradle/