描述

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


当前回答

Windows 10 Pro上的PowerShell 上述解决方案没有为我工作作为普通的pwd给出了响应中的描述:

Path
----
C:\Users\barnaby

它需要作为脚本$(pwd)中的变量输出,但docker抱怨无效的引用格式

解决方案是将整个开关参数包装在双引号中,这对我来说是有效的:

docker run --rm -v "$(pwd):/app" php:7.4-cli php /app/hello.php

其他回答

在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

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

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

这适用于我在PowerShell:

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

下面是我的,它兼容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 10 Pro上的PowerShell 上述解决方案没有为我工作作为普通的pwd给出了响应中的描述:

Path
----
C:\Users\barnaby

它需要作为脚本$(pwd)中的变量输出,但docker抱怨无效的引用格式

解决方案是将整个开关参数包装在双引号中,这对我来说是有效的:

docker run --rm -v "$(pwd):/app" php:7.4-cli php /app/hello.php