在Windows上使用MINGW bash执行时,docker build命令将'C:/Program Files/Git'添加到作为构建参数传递的路径中。
在Windows上使用MINGW bash执行时,docker build命令将'C:/Program Files/Git'添加到作为构建参数传递的路径中。
我有以下的Dockerfile:
FROM ubuntu:16.04 ARG path1=def_path1 RUN mkdir ${path1}
当我使用以下命令构建这个Dockerfile时:
docker build --build-arg path1=/home/dragan -t build_arg_ex .
当我在Windows 10的MINGW Bash中执行时,我得到以下错误:
$ ./build.sh --no-cache Sending build context to Docker daemon 6.144kB Step 1/3 : FROM ubuntu:16.04 ---> 2a4cca5ac898 Step 2/3 : ARG path1=def_path1 ---> Running in a35241ebdef3 Removing intermediate container a35241ebdef3 ---> 01475e50af4c Step 3/3 : RUN mkdir ${path1} ---> Running in 2759e683cbb1 mkdir: cannot create directory 'C:/Program': No such file or directory mkdir: cannot create directory 'Files/Git/home/dragan': No such file or directory The command '/bin/sh -c mkdir ${path1}' returned a non-zero code: 1
在Windows命令提示符、Linux或Mac上构建相同的Dockerfile是没有问题的。问题只出现在MINGW Bash终端上,因为它在传递的路径之前添加了'C:/Program Files/Git'前缀。
有没有办法在MINGW Bash中执行这个命令,使其不添加'C:/Program Files/Git'前缀?
谢谢。
问题的出现原因是在Windows的MINGW bash环境中执行docker build命令时,需要将'C:/Program Files/Git'路径添加到构建参数中的路径中。这是因为在MINGW bash中执行docker build命令时,会将路径转换为Windows格式,而'C:/Program Files/Git'路径中的空格会导致转换失败。
解决方法是在.bashrc文件中添加一个bash函数来解决这个问题。该函数会在执行docker命令时临时设置MSYS_NO_PATHCONV环境变量为1,从而禁用路径转换。这样就可以将'C:/Program Files/Git'路径正确地传递给docker build命令。
以下是解决方法的代码:
# See https://github.com/docker/toolbox/issues/673#issuecomment-355275054 # Workaround for Docker for Windows in Git Bash. docker() { (export MSYS_NO_PATHCONV=1; "docker.exe" "$@") }
如果还需要在MINGW bash中执行docker-compose命令,也可以采用类似的方法进行解决。
通过添加上述代码到.bashrc文件中,可以更加永久地解决docker在MINGW bash中的路径转换问题,而不需要全局启用MSYS_NO_PATHCONV环境变量,从而避免其他潜在的问题。
问题的出现原因是Git for Windows存在一个bug/限制,具体描述在发布说明的“已知问题”部分中,如果指定以斜杠开头的命令行选项,会触发POSIX到Windows路径转换,将例如“/usr/bin/bash.exe”转换为“C:\Program Files\Git\usr\bin\bash.exe”。当不希望发生这种转换时,例如“--upload-pack=/opt/git/bin/git-upload-pack”或“-L/regex/”,需要临时设置环境变量MSYS_NO_PATHCONV,如下所示:
MSYS_NO_PATHCONV=1 git blame -L/pathconv/ msys2_path_conv.cc
另外,您还可以加倍第一个斜杠以避免POSIX到Windows路径转换,例如“//usr/bin/bash.exe”。
非常感谢!转义初始斜杠意味着我可以从gitbash运行docker exec 🙂