在Windows 10上将当前目录挂载为Docker中的卷

McG*_*cGo 84 windows docker

描述

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

建立

我有一个驱动器E,文件夹"test",并在那里有一个名为"Windows主机上的文件夹"的文件夹,以显示该命令正在运行.Dockerfile创建目录/data,将其定义为VOLUME和WORKDIR.

E:\test在PowerShell中的当前目录和绝对路径执行多克尔命令,我可以看到的内容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
Run Code Online (Sandbox Code Playgroud)

问题

我想使用当前目录而不是绝对符号.由于不同的错误消息,我无法在卷中使用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'.
Run Code Online (Sandbox Code Playgroud)

尝试使用/($ 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'.
Run Code Online (Sandbox Code Playgroud)

尝试使用\'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'.
Run Code Online (Sandbox Code Playgroud)

尝试使用`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'.
Run Code Online (Sandbox Code Playgroud)

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

ETL*_*ETL 183

在Windows命令行(cmd)中,您可以像这样挂载当前目录:

${PWD}

在PowerShell中,您使用cmd,它为您提供当前目录:

${PWD}

跨平台

以下两个选项适用于PowerShell和Linux:

cmd

${PWD}

  • 使用Git Bash,它可以是`winpty docker run -it -v"/ $(pwd -W):/ usr/src/project"gcc:4.9`或`winpty docker run -it -v"/ $(cmd// c cd):/ usr/src/project"gcc:4.9`. (4认同)
  • 在 Windows 10 上对我不起作用,安装成功但目标目录为空 (4认同)
  • 您的 CMD 示例是正确的并且效果很好!Power Shell 变体不起作用,虽然 $pwd.path 本身是正确的,但在脚本中使用时并未解析为正确的值:https://gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183 (2认同)
  • `$ {PWD}`也可以在Unix系统上工作(Linux,macOS)。**注意**:`pwd` =当前工作目录 (2认同)
  • @cjsimon它实际上看起来可能有...似乎PowerShell支持`$(pwd)`这也适用于Linux(我认为 - 未经测试) (2认同)

fri*_*ism 20

这在PowerShell中适用于我:

docker run --rm -v ${PWD}:/data alpine ls /data
Run Code Online (Sandbox Code Playgroud)

  • 这仍然有效吗?尝试时我得到以下内容:`PS C:\ Users\X\Projects\docker_django> docker run --rm -v $ {PWD}:/ data alpine ls/data C:\ Program Files\Docker Toolbox\docker.exe :来自守护程序的错误响应:无效模式:/ data.请参阅'C:\ Program Files\Docker Toolbox\docker.exe run --help' (4认同)
  • @finlay-roelofs 谢谢,但 Docker for Win 仅适用于 Win Pro。 (2认同)

Pau*_*son 17

  1. 在 Docker 桌面(Docker for Windows)上打开设置
  2. 选择共享驱动器
  3. 选择要在容器内使用的驱动器(例如,C)。
  4. 点击应用。可能会要求您提供用户凭据。 在 Windows 上为容器启用驱动器

  5. 下面的命令现在应该可以在 PowerShell 上运行(命令提示符不支持${PWD}):

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

重要提示:如果/当您更改 Windows 域密码时,挂载将停止静默运行,即可以运行,-v但容器看不到您的主机文件夹和文件。解决方案:返回设置,取消选中共享驱动器,应用,再次检查它们,应用,并在出现提示时输入新密码。


Toa*_*oul 6

对于Windows的Git Bash(在ConEmu中),以下对我有用(对于Docker Windows容器):

docker run --rm -it -v `pwd -W`:c:/api microsoft/dotnet:2-runtime
Run Code Online (Sandbox Code Playgroud)

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

使用PWD的所有其他变体,我已经尝试过收到: "Error response from daemon: invalid volume specification: ..."

更新:以上内容适用于Docker Windows容器,适用于Linux容器:

docker run --rm -it -v `pwd -W`:/api -p 8080:80 microsoft/aspnetcore:2
Run Code Online (Sandbox Code Playgroud)


Evg*_*yst 5

命令提示符 ( Cmd.exe)

从 WindowsCmd.exe使用Docker CLI 时,使用%cd%挂载当前目录:

echo test > test.txt
docker run --rm -v %cd%:/data busybox ls -ls /data/test.txt
Run Code Online (Sandbox Code Playgroud)

Git Bash (MinGW)

当从 Git Bash (MinGW) 使用 Docker CLI 时,挂载当前目录可能会由于 POSIX 路径转换而失败:从 linux 样式路径转换时,Docker 挂载的卷添加 ;C 到 windows 路径的末尾

通过前缀转义 POSIX 路径 /

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

touch test.txt
docker run --rm -v /$(pwd):/data busybox ls -la //data/test.txt
Run Code Online (Sandbox Code Playgroud)

禁用路径转换

通过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
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
Run Code Online (Sandbox Code Playgroud)


Abh*_*CTO 5

我假设您已经在 Windows 10 计算机上设置了 Docker。

下一步显然是将当前目录安装为卷。

为此,您可以-v像这样使用该标志:

# in bash
docker run -v "$(pwd):/app" <image_name>

# in powershell
docker run -v "$(PWD):/app" <image_name>
Run Code Online (Sandbox Code Playgroud)

或者,正如 kittaakos 指出的那样,您可以winpty像这样使用 Git Bash:

winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9
Run Code Online (Sandbox Code Playgroud)

资料来源: