Docker挂载卷添加;从linux样式路径转换时,将C转换到windows路径的末尾

jdgnovmf  于 2023-06-05  发布在  Docker
关注(0)|答案(8)|浏览(609)

我发现了一些有趣的奇怪之处,当我试图在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问题。

8ftvxx2r

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,当前工作目录:

docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev
8yparm6h

8yparm6h2#

从Git Bash(MinGW)将当前目录装载到Windows 10中的Docker容器可能会由于POSIX路径转换而失败。任何以/开头的路径都将转换为有效的Windows路径。

touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# ls: C:/Git/data/test.txt: No such file or directory

用前缀/转义POSIX路径

要跳过路径转换,所有POSIX路径都必须加上额外的前导斜杠(/),包括/$(pwd)

touch test.txt
docker run --rm -v /$(pwd):/data busybox ls -la //data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 //data/test.txt

在Git Bash中,路径//data/test.txt不会被转换,在Linux shell中,//(前导双斜杠)被忽略,并以与/相同的方式处理。

关闭路径转换

在Git Bash(MinGW)中使用MSYS_NO_PATHCONV环境变量禁用POSIX路径转换。
可以在命令级别禁用路径转换:

touch test.txt
MSYS_NO_PATHCONV=1 docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 /data/test.txt

可以在shell(或系统)级别禁用路径转换:

export MSYS_NO_PATHCONV=1
touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt
# -rwxr-xr-x    1 root     root             0 Jun 22 23:45 /data/test.txt
ca1c2owp

ca1c2owp3#

对我来说,解决方案是简单地在任何路径的末尾包含一个关闭斜杠/
例如,代替
/opt/apache-atlas-2.0.0/bin/atlas_start.py
。。。使用
/opt/apache-atlas-2.0.0/bin/atlas_start.py/

tv6aics1

tv6aics14#

我在git bash上遇到了同样的问题,而不是命令提示符。你可以

docker run -it --rm -v "/${PWD}/D:\my\project\folder":/wkDir $IMAGE_TAG yarn dev
mzaanser

mzaanser5#

你能试着在下面指挥-

docker run -it --rm -v %cd%:/wkDir $IMAGE_TAG yarn dev
ezykj2lf

ezykj2lf6#

我也遇到过同样的问题。根据你是否使用Git Bash,这个命令可以工作(以nginx为例):
docker container run --name container-name -v pwd -W /html:/usr/share/nginx/html -p 8000:80 -d nginx
当然,您可以根据需要指定端口和目录。

qcbq4gxm

qcbq4gxm7#

直为我在下面工作。只是不要使用动态变量。

docker run --rm -u root -p 8080:8080 -v jenkins-data/:/var/jenkins_home -v /var/run/docker.sock/:/var/run/docker.sock -v /Users/<YOUR USER NAME>/:/home jenkinsci/blueocean
z9zf31ra

z9zf31ra8#

我在MSYS2(Mingw64)上遇到了同样的问题。在阅读Filesystems Paths - MSYS2之后,我在命令行中的docker run之前添加了MSYS2_ARG_CONV_EXCL='*',以防止所有参数都被“转换”,这就完成了。
示例(MSYS2 Mingw64):

$> MSYS2_ARG_CONV_EXCL='*' docker run --rm -d -v my_volume:/var/lib/my_volume myimage

事实上,Mingw试图通过将看起来像Unix的路径转换为Windows路径来变得聪明。但我们可以看到:* 虽然这在很多情况下都很有用,但它也不是完美的,在极端情况下,它会转换看起来像Unix路径的参数,而实际上它们不是,或者检测没有Unix路径的列表。
您还可以通过指定要排除的选项来微调哪些参数被“转换”或不被“转换”,请阅读链接。

相关问题