我发现了一些有趣的奇怪之处,当我试图在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问题。
8条答案
按热度按时间8ftvxx2r1#
因此,通过一些额外的挖掘,我发现了这三个线程,与git-bash搞砸Docker mount有关:
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试图更聪明,填充语法并输出这种格式的路径,这将解释它。解决方案是转义路径转换,使用前缀
/
。因此,工作docker命令从git-bash运行docker,当前工作目录:8yparm6h2#
从Git Bash(MinGW)将当前目录装载到Windows 10中的Docker容器可能会由于POSIX路径转换而失败。任何以
/
开头的路径都将转换为有效的Windows路径。用前缀
/
转义POSIX路径要跳过路径转换,所有POSIX路径都必须加上额外的前导斜杠(
/
),包括/$(pwd)
。在Git Bash中,路径
//data/test.txt
不会被转换,在Linux shell中,//
(前导双斜杠)被忽略,并以与/
相同的方式处理。关闭路径转换
在Git Bash(MinGW)中使用
MSYS_NO_PATHCONV
环境变量禁用POSIX路径转换。可以在命令级别禁用路径转换:
可以在shell(或系统)级别禁用路径转换:
ca1c2owp3#
对我来说,解决方案是简单地在任何路径的末尾包含一个关闭斜杠
/
。例如,代替
/opt/apache-atlas-2.0.0/bin/atlas_start.py
。。。使用
/opt/apache-atlas-2.0.0/bin/atlas_start.py/
tv6aics14#
我在git bash上遇到了同样的问题,而不是命令提示符。你可以
mzaanser5#
你能试着在下面指挥-
ezykj2lf6#
我也遇到过同样的问题。根据你是否使用Git Bash,这个命令可以工作(以nginx为例):
docker container run --name container-name -v
pwd -W
/html:/usr/share/nginx/html -p 8000:80 -d nginx当然,您可以根据需要指定端口和目录。
qcbq4gxm7#
直为我在下面工作。只是不要使用动态变量。
z9zf31ra8#
我在MSYS2(Mingw64)上遇到了同样的问题。在阅读Filesystems Paths - MSYS2之后,我在命令行中的
docker run
之前添加了MSYS2_ARG_CONV_EXCL='*'
,以防止所有参数都被“转换”,这就完成了。示例(MSYS2 Mingw64):
事实上,Mingw试图通过将看起来像Unix的路径转换为Windows路径来变得聪明。但我们可以看到:* 虽然这在很多情况下都很有用,但它也不是完美的,在极端情况下,它会转换看起来像Unix路径的参数,而实际上它们不是,或者检测没有Unix路径的列表。
您还可以通过指定要排除的选项来微调哪些参数被“转换”或不被“转换”,请阅读链接。