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


132

描述

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

建立

我有一个带文件夹“ test”的驱动器E,在其中有一个名为“ 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

问题

我想使用当前目录而不是绝对符号。由于不同的错误消息,我无法在卷中使用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中将当前目录作为卷挂载的正确语法是什么?

Answers:


308

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

docker run --rm -it -v %cd%:/usr/src/project gcc:4.9

在PowerShell中,使用${PWD},它会为您提供当前目录:

docker run --rm -it -v ${PWD}:/usr/src/project gcc:4.9

在Linux上:

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

跨平台

以下选项在PowerShell和Linux(至少是Ubuntu)上均可使用:

docker run --rm -it -v ${PWD}:/usr/src/project gcc:4.9
docker run --rm -it -v $(pwd):/usr/src/project gcc:4.9

您的CMD示例是正确的,效果很好!Power Shell变体不起作用,尽管$ pwd.path本身是正确的,但在脚本中使用时无法解析为正确的值:gist.github.com/McGo/8924cc5b0609f13c39092554a0bef183
McGo

3
${PWD}也可以在Unix系统(Linux,macOS)上使用。注意pwd=当前工作目录
thiagowfx

2
@cjsimon实际上看起来可能有...似乎PowerShell支持$(pwd)也可以在Linux上运行(我认为-未经测试)
ETL

12
使用Git Bash可以是winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9winpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9
kittaakos

1
在Windows 10上对我不起作用,安装成功,但目标目录为空
J. Doem

23

这对我在PowerShell中有效:

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

4
这仍然有效吗?在尝试时,我得到以下信息:PS C:\Users\X\Projects\docker_django> docker run --rm -v ${PWD}:/data alpine ls /data C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: invalid mode: /data. See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.
mistalaba '18

@mistalaba如果您使用的是Windows 10,请尝试使用Docker for Windows代替Toolbox
Finlay Roelofs

2
@ finlay-roelofs谢谢,但是Docker for Win仅适用于Win Pro。
米塔拉巴'18

9

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

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

注意周围的反引号/反引号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

没有从cmder搬运工运行-v为我工作pwd -W:在/ usr /共享/数据atomgraph /定式--file =的/ usr /共享/数据/ Mokyklu_sarasas.ttl / mokyklos未找到文件:C:/工具/ cmder /供应商/git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
MartynasJusevičius18年

我这样做了,包括反引号在内,并且在Windows上使用gitbash效果很好
Thiago Cardoso

我可以确认这在第一个选项上也适用于hyper gitbash
Andy

反引号是执行嵌入式命令的效率较低的方法。更好的方法是使用$(command)而不是`command`
Timothy c

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

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

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

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


2

这是与Win10 docker-ce和Win7 docker-toolbox都兼容的我的。当时,我正在写这篇文章:)。

您可能会注意到,我更喜欢使用/ host_mnt / c而不是c:/,因为有时我在docker-ce Win 10上使用c:/遇到麻烦

$WIN_PATH=Convert-Path .

#Convert for docker mount to be OK on Windows10 and Windows 7 Powershell
#Exact conversion is : remove the ":" symbol, replace all "\" by "/", remove last "/" and minor case only the disk letter
#Then for Windows10, add a /host_mnt/" at the begin of string => this way : c:\Users is translated to /host_mnt/c/Users
#For Windows7, add "//" => c:\Users is translated to //c/Users
$MOUNT_PATH=(($WIN_PATH -replace "\\","/") -replace ":","").Trim("/")

[regex]$regex='^[a-zA-Z]/'
$MOUNT_PATH=$regex.Replace($MOUNT_PATH, {$args[0].Value.ToLower()})

#Win 10
if ([Environment]::OSVersion.Version -ge (new-object 'Version' 10,0)) {
$MOUNT_PATH="/host_mnt/$MOUNT_PATH"
}
elseif ([Environment]::OSVersion.Version -ge (new-object 'Version' 6,1)) {
$MOUNT_PATH="//$MOUNT_PATH"
}

docker run -it -v "${MOUNT_PATH}:/tmp/test" busybox ls /tmp/test

想要评论并确认这是Windows Server 2012上Docker Toolbox的一百万美元解答!!!极好的工作!对于任何人的好奇心, ${MOUNT_PATH}解析为/c/Program Files/Docker Toolbox
petrosmm '19

2

其他人提供的Git Bash其他解决方案对我来说不起作用。显然,Windows版Git当前存在错误/限制。看到这个这个

找到这个GitHub线程后,我终于设法使其工作(如果您有兴趣,它可以提供一些其他解决方案,可能对您有用,但对我而言不行)。

我最终使用以下语法:

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

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

另外,如果重要的话,我正在Windows上使用Linux容器。

我在新的Windows Terminal,ConEmu和GitBash中对此进行了测试,它们都为我工作。


您好,这终于帮助我完成了这项工作。您知道我们为什么需要MSYS_NO_PATHCONV=1命令选项吗?否则,我的目标装载目录将充满“ c:/ tools / cmder / vendor / git-for-windows”
Austin L

1

此命令应该修复它。

泊坞窗运行--rm -it -v ${PWD}:c:\datamirkohaaser / docker-clitools

{PWD}是主机当前文件夹。之后:是容器文件夹。如果安装正确,则文件将c:\data在容器的目录中列出。


1

您需要将所有反斜杠交换为正斜杠,因此请进行更改

泊坞窗-v C:\ my \ folder:/ mountlocation ...

泊坞窗-v C:/ my / folder:/ mountlocation ...

我通常从cmd脚本调用docker,我希望在该脚本中将文件夹安装到相对于我正在调用的脚本的位置,因此在该脚本中执行此操作...

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

0

命令提示(Cmd.exe

在Windows上Cmd.exe使用Docker CLI时,用于%cd%挂载当前目录:

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

Git Bash(MinGW)

当多克尔CLI从GIT中击(MinGW的)中使用,安装在当前目录可能由于一POSIX路径转换:泊坞安装体积增加; C到从Linux风格的路径平移时结束窗口路径

通过在前缀之前转义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

或外壳(系统)级别

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

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

git bash

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

echo ${PWD} 结果:

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

cmdPowerShell

  cd C:\Users\Christian\manager

echo ${PWD} 结果:

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

正如我们在cmdPowerShell $ {PWD}中看到的那样,


4
另外,请用英文写出解决方案的说明。这将有助于消除人们对StackOverflow是一种免费代码编写服务的误解。
Yunnosch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.