描述

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


当前回答

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

其他回答

这适用于我在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

如果你想把你的项目目录和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容器工具

如果你在2022年仍然有这个问题,你可以在带有WSL(windows Subsystem for Linux)的windows中安装docker。然后你可以去微软商店安装一个Linux项目,比如Ubuntu, Debian或Kali Linux。

在Docker Desktop上进入setting -> WSL integration 并启用您的Linux版本。

在VS Code上打开新的WSL终端并在那里执行Linux命令。

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