在Windows上使用MINGW bash执行时,docker build命令将'C:/Program Files/Git'添加到作为构建参数传递的路径中。

7 浏览
0 Comments

在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'前缀?

谢谢。

0
0 Comments

问题的出现原因是在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环境变量,从而避免其他潜在的问题。

0
0 Comments

问题的出现原因是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 🙂

0