尝试在 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/

10-16 18:25
查看更多