尝试在 Windows 上安装 docker 镜像时,我发现了一些有趣的奇怪之处。
我创建了一个 .sh
脚本,它会挂载项目文件夹以运行我们的开发人员环境镜像。我想要一个每个开发人员都可以运行的脚本,无论他们的机器如何。它所做的就是使用当前项目文件夹运行 docker。
#!/usr/bin/env bash
docker run -it --rm -v D:\my\project\folder:/wkDir $IMAGE_TAG yarn dev
运行正常。现在计划是从
npm
调用这个脚本,所以我希望它相对于当前文件夹工作。让我们尝试另一个版本。docker run -it --rm -v $PWD:/wkDir $IMAGE_TAG yarn dev
失败:
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from
daemon: Mount denied:
The source path "D:/my/project/folder;C"
doesn't exist and is not known to Docker.
笏。什么是
;C
,它来自哪里?所以我做了
echo $PWD
这给了我 /d/my/project/folder
。有趣的是,因此
$PWD
解析为 linux 路径格式中的正确路径,似乎 docker 正在尝试从该路径转换为正确的 Windows 路径,除了这个 ;C
突然出现。而 \
是 /
...这里到底发生了什么?
我在 VSCode 的终端 git bash 和 powershell 中得到了相同的结果。
更新:我注意到在 VSCode 的 powershell 终端中运行
.sh
会打开一个单独的 cmd.exe
控制台窗口,它似乎在 git bash 中运行脚本。所以这可能是一个 git bash 问题。 最佳答案
因此,通过一些额外的挖掘,我发现了这三个线程,与 git-bash 破坏 docker mount 相关:
https://forums.docker.com/t/weird-error-under-git-bash-msys-solved/9210
https://github.com/moby/moby/issues/24029#issuecomment-250412919
当我查找 mingw 的关于 git-bash 正在使用的路径转换的文档时,我找到了这个语法表:
http://www.mingw.org/wiki/Posix_path_conversion
其中之一的输出格式为: x;x;C:\MinGW\msys\1.0\x
。请注意其中的 ;C
。如果 git-bash 试图变得聪明,填充语法并使用这种格式输出路径,这将解释它。
解决方案是转义路径转换,使用前缀 /
。因此,使用当前工作目录从 git-bash 运行 docker 的工作 docker 命令:
docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev
关于从 linux 样式路径转换时,Docker 安装的卷将 ;C 添加到 windows 路径的末尾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50608301/