尝试在Windows上安装Docker映像时,我发现了一些有趣的怪异现象。
我创建了一个.sh脚本,该脚本会装载项目文件夹以运行我们的开发人员环境映像。我希望每个开发人员都可以运行一个脚本,而不管他们的计算机如何。它所做的只是在当前项目文件夹下运行docker。
.sh
#!/usr/bin/env bash docker run -it --rm -v D:\my\project\folder:/wkDir $IMAGE_TAG yarn dev
运行正常。现在的计划是从中调用此脚本npm,因此我希望此脚本相对于当前文件夹起作用。让我们尝试另一个版本。
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和它是在哪里来的呢?
;C
所以我这样做echo $PWD给了我/d/my/project/folder。
echo $PWD
/d/my/project/folder
有趣的是,所以$PWD将其解析为linux路径格式的正确路径,并且似乎docker试图将其转换为正确的Windows路径,除非这个;C出现在任何地方。而且\是/…
$PWD
\
/
这到底是怎么回事?
我在VSCode的终端git bash和powershell中得到了相同的结果。
更新:我注意到.sh在VSCode的powershell终端中运行,会打开一个单独的cmd.exe控制台窗口,该窗口似乎在git bash中运行脚本。因此,这可能是git bash问题。
cmd.exe
因此,通过一些额外的挖掘,我发现了这三个线程,与git-bash破坏Docker挂载有关:
https://forums.docker.com/t/weird-error-under-git-bash-msys-solved/9210 https://github.com/moby/moby/issues/24029#issuecomment-250412919
当我查看有关git- bash使用的路径转换的mingw文档时,我发现此语法表:http : //www.mingw.org/wiki/Posix_path_conversion
其中之一以以下格式输出:x;x;C:\MinGW\msys\1.0\x。注意;C其中。如果git- bash试图变得更聪明,则填充语法并以这种格式输出路径,这将对此进行解释。
x;x;C:\MinGW\msys\1.0\x
解决方案是使用前缀来逃避路径转换/。因此,工作中的docker命令从git-bash使用当前工作目录运行docker:
docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev