描述

我通过Hyper-V在Windows 10上使用Docker 1.12.5版本,并希望在当前路径中使用容器可执行文件作为命令。我构建了一个运行正常的Docker映像,但在挂载当前路径时遇到了一个问题。这个想法是创建一个别名并运行docker——rm[…]命令,以便它可以在当前目录中在系统范围内使用。

设置

我有一个驱动器E的文件夹“测试”,在那里有一个文件夹称为“文件夹上的windows主机”,以显示该命令正在工作。Dockerfile创建目录/data,定义为VOLUME和WORKDIR。

将E:\test作为PowerShell中的当前目录,并以绝对路径执行Docker命令,我可以看到E:\test的内容:

PS E:\test> docker run --rm -it -v E:\test:/data mirkohaaser/docker-clitools ls -la
total 0
drwxr-xr-x 2 root root 0 Jan  4 11:45 .
drwxr-xr-x 2 root root 0 Jan  5 12:17 folder on windows host

问题

我想使用当前目录,而不是绝对符号。由于不同的错误消息,我无法在卷中使用pwd:

尝试使用($pwd)

PS E:\test> docker run --rm -it -v ($pwd):/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error parsing reference: ":/data" is not a valid repository/tag.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

尝试使用/($pwd)

PS E:\test> docker run --rm -it -v /($pwd):/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error parsing reference: "E:\\test" is not a valid repository/tag.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

尝试用\´pwd\´

PS E:\test> docker run --rm -it -v ´$pwd´:/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: Invalid bind mount spec "´E:\\test´:/data": invalid mode: /data.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

尝试使用" pwd "

PS E:\test> docker run --rm -it -v `$pwd`:/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: create $pwd: "$pwd" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.

在Windows 10的Docker中将当前目录挂载为卷的正确语法是什么?


当前回答

命令提示符(Cmd.exe)

当在Windows Cmd.exe中使用Docker命令行时,使用%cd%挂载当前目录:

echo test > test.txt
docker run --rm -v %cd%:/data busybox ls -ls /data/test.txt

Git Bash (MinGW)

当Docker命令行从Git Bash (MinGW)中使用时,由于POSIX路径转换,挂载当前目录可能会失败:Docker mounted volume add;C to end of windows path When translfrom linux style path。

通过添加/前缀转义POSIX路径

要跳过路径转换,POSIX路径必须以斜杠(/)作为前缀,以具有前导双斜杠(//),包括/$(pwd)

touch test.txt
docker run --rm -v /$(pwd):/data busybox ls -la //data/test.txt

禁用路径转换

通过在命令级设置MSYS_NO_PATHCONV=1环境变量,禁用Git Bash (MinGW)中的POSIX路径转换

touch test.txt
MSYS_NO_PATHCONV=1 docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt

或shell(系统)级

export MSYS_NO_PATHCONV=1
touch test.txt
docker run --rm -v $(pwd):/data busybox ls -la /data/test.txt

其他回答

这适用于我在PowerShell:

docker run --rm -v ${PWD}:/data alpine ls /data

你需要把所有的后斜杠换成正斜杠 所以改变

C:\my\folder:/mountlocation…

to

C:/my/folder:/mountlocation…

我通常调用docker从一个cmd脚本,我想文件夹挂载相对于脚本,我正在调用,所以在该脚本中,我这样做…

SETLOCAL

REM capture the path to this file so we can call on relative scrips
REM without having to be in this dir to do it.

REM capture the path to $0 ie this script
set mypath=%~dp0

REM strip last char
set PREFIXPATH=%mypath:~0,-1%

echo "PREFIXPATH=%PREFIXPATH%"
mkdir -p %PREFIXPATH%\my\folder\to\mount

REM swap \ for / in the path
REM because docker likes it that way in volume mounting
set PPATH=%PREFIXPATH:\=/%
echo "PPATH=%PPATH%"

REM pass all args to this script to the docker command line with %*
docker run --name mycontainername --rm -v %PPATH%/my/folder/to/mount:/some/mountpoint  myimage %*

ENDLOCAL
docker run --rm -v /c/Users/Christian/manager/bin:/app --workdir=/app  php:7.2-cli php  app.php

去猛击

 cd /c/Users/Christian/manager
    docker run --rm -v  ${PWD}:/app  --workdir=/app  php:7.2-cli php  bin/app.php

echo $ {PWD} 结果:

/ c /用户/基督教/经理

cmd或PowerShell

  cd C:\Users\Christian\manager

echo $ {PWD} 结果:

路径 ——C:\Users\Christian\manager

正如我们在cmd或PowerShell中看到的$ {PWD}将无法工作

对于Git Bash For Windows(在ConEmu中),以下对我来说是有效的(对于Docker Windows容器):

docker run --rm -it -v `pwd -W`:c:/api microsoft/dotnet:2-runtime

注意pwd -W周围的反引号/反引号!

我尝试过的PWD的所有其他变体都收到了:“来自守护进程的错误响应:无效的卷规范:…”

更新: 以上是针对Docker Windows容器,针对Linux容器使用的:

docker run --rm -it -v `pwd -W`:/api -p 8080:80 microsoft/aspnetcore:2

打开Docker Desktop上的设置(Docker for Windows)。 选择“Shared Drives”。 选择要在容器中使用的驱动器(例如,C)。 单击Apply。您可能会被要求提供用户凭证。 下面的命令现在可以在PowerShell上运行了(命令提示符不支持${PWD}): docker run——rm -v ${PWD}:/data alpine ls /data

重要提示:如果/当您更改Windows域密码时,挂载将停止静默工作,即-v将工作,但容器将看不到您的主机文件夹和文件。处理方法:返回“设置”,取消勾选共享驱动器,选择“应用”,再选择“应用”,根据界面提示输入新密码。