从linux样式路径转换时,Docker装入的卷在Windows路径的末尾添加; C


88

尝试在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中得到了相同的结果。

更新:我注意到.sh在VSCode的powershell终端中运行,会打开一个单独的cmd.exe控制台窗口,该窗口似乎在git bash中运行脚本。因此,这可能是git bash问题。

Answers:


125

因此,通过一些额外的挖掘,我发现了这三个线程,与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试图变得更聪明,则填充语法并以这种格式输出路径,这将对此进行解释。

解决方案是使用前缀来逃避路径转换/。因此,工作中的docker命令从git-bash使用当前工作目录运行docker:

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

9
我发现我必须另外将路径包装成字符串,所以"/${PWD}"
Bananaapple '18

11
$ docker run -p 8080:3000 -v /$(pwd):/var/www -w //var/www node npm start 最终,我发现必须在括号中使用前导斜线而不是括号。另外,在工作目录中,我需要两个前导斜线。仅供参考:这是我在Pluralsight上为Web开发人员使用Docker
Andy2K11

这对我有用(在Windows 10 git bash上):docker run --name my-wordpress -v“ / $ {PWD} / wordpress”:/ wordpress_sources -p 80:80 -dk <image_name>
progonkpa

1
拯救生命。Windows10和git-bash在这里花费了我很长时间尝试在不使用docker-compose的情况下挂载卷,直到我看到这篇文章。现在可以使用:docker run --rm -v /${PWD}/migrations:/flyway/sql --network xxx_default flyway。谢谢。
艾米丽

生活。节省。+1000000
Jonathan

3

对我来说,解决方案就是在任何路径的末尾都包含一个斜杠/

例如代替

/opt/apache-atlas-2.0.0/bin/atlas_start.py

...使用

/opt/apache-atlas-2.0.0/bin/atlas_start.py/


3

由于POSIX路径转换,将当前目录从Git Bash(MinGW)安装到Windows 10中的Docker容器中可能会失败。任何以开头的路径/都将转换为有效的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中//(前导双斜杠)会被忽略,并与对待/

禁用路径转换

使用MSYS_NO_PATHCONV环境变量在Git Bash(MinGW)中禁用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

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

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

2
感谢您提供此解决方案,因为转义对我不起作用,而禁用路径转换则对我不起作用。
Chanandler Bong


0

我实际上也遇到过同样的问题。取决于您是否使用Git Bash,此命令是否有效(以nginx为例):

docker容器运行--name容器名称-v`pwd -W` / html:/ usr / share / nginx / html -p 8000:80 -d nginx

当然,您可以根据需要指定端口和目录。


0

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

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

0

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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.