尝试在Windows上安装docker镜像时,我发现了一些有趣的怪异.
我创建了一个.sh脚本,它执行项目文件夹的安装以运行我们的开发人员环境图像.我想要一个每个开发人员都可以运行的脚本,无论他们的机器如何.它所做的就是使用当前项目文件夹运行docker.
#!/usr/bin/env bash
docker run -it --rm -v D:\my\project\folder:/wkDir $IMAGE_TAG yarn dev
Run Code Online (Sandbox Code Playgroud)
运行没问题.现在的计划是调用这个脚本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.
Run Code Online (Sandbox Code Playgroud)
笏.这是什么;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问题.
Seb*_*eth 83
所以通过一些额外的挖掘,我找到了这三个线程,与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
当我在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与当前工作目录:
x;x;C:\MinGW\msys\1.0\x
由于 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
Run Code Online (Sandbox Code Playgroud)
/要跳过路径转换,所有 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
Run Code Online (Sandbox Code Playgroud)
在 Git Bash 中,路径//data/test.txt不会被转换,并且在 Linux shells //(前导双斜杠)中被忽略并以与/.
使用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
Run Code Online (Sandbox Code Playgroud)
可以在外壳(或系统)级别禁用路径转换:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14746 次 |
| 最近记录: |