描述

我通过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中将当前目录挂载为卷的正确语法是什么?


当前回答

如果你想把你的项目目录和DockerfileRunArguments属性传递给你的调试容器,那么pwd将不起作用。

<PropertyGroup>
     <!-- Will result in `` -->
     <DockerfileRunArguments>-v "$(pwd):/data:ro"</DockerfileRunArguments>
</PropertyGroup>

使用$(MSBuildProjectDirectory)代替$(pwd)

<PropertyGroup>
     <!-- Will result in the full path to your project directory -->
     <DockerfileRunArguments>-v "$(MSBuildProjectDirectory):/data:ro"</DockerfileRunArguments>
</PropertyGroup>

参考:MSDocs - Visual Studio容器工具

其他回答

其他人为Git Bash提供的其他解决方案对我不起作用。显然,Git for Windows目前有一个bug/限制。看看这个和这个。

在找到这个GitHub线程后,我终于设法让它工作(如果你感兴趣,它提供了一些额外的解决方案,这可能对你有用,但对我没用)。

我最终使用以下语法:

MSYS_NO_PATHCONV=1 docker run --rm -it -v $(pwd):/usr/src/project gcc:4.9

注意docker命令前面的MSYS_NO_PATHCONV=1和$(pwd) -圆括号,小写pwd,没有引号,没有反斜杠。

此外,我在Windows上使用Linux容器,如果这很重要。

我在新的Windows终端、ConEmu和giitbash中测试了这个功能,它们都很适合我。

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}将无法工作

这个命令应该可以解决这个问题。

docker运行——rm -it -v ${PWD}:c:\data mirkohaaser/docker-clitools

{PWD}是主机当前文件夹。:后面是容器文件夹。 如果挂载是正确的,那么文件将被列在容器的目录c:\data中。

这适用于我在PowerShell:

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

对于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