描述
我在Windows 10上通过Hyper-V使用Docker版本1.12.5,并希望将容器可执行文件用作当前路径中的命令。我构建了一个运行正常的Docker镜像,但是我在安装当前路径时遇到了问题。我们的想法是创建一个别名并执行docker run --rm [...]
命令,以便可以在系统范围内使用它在当前目录中。
设置
我有一个带有“test”文件夹的驱动器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中的卷的正确语法是什么?
答案 0 :(得分:135)
在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
答案 1 :(得分:18)
这适用于PowerShell:
docker run --rm -v ${PWD}:/data alpine ls /data
答案 2 :(得分:4)
对于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
答案 3 :(得分:2)
其他人为Git Bash提供的其他解决方案对我不起作用。显然,Windows版Git当前存在错误/限制。参见this和this。
找到this GitHub thread后,我终于设法使其工作(如果您有兴趣,它可以提供一些其他解决方案,这可能对您有用,但对我不适用)。
我最终使用以下语法:
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中对此进行了测试,它们都为我工作。
答案 4 :(得分:2)
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)使用Docker CLI时,由于POSIX路径转换:Docker mounted volume adds ;C to end of windows path when translating from linux style path,安装当前目录可能会失败。
/
为前缀转义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
答案 5 :(得分:1)
答案 6 :(得分:0)
此命令应该修复它。
docker run --rm -it -v ${PWD}:c:\data
mirkohaaser / docker-clitools
{PWD}是主机的当前文件夹。 :
之后是容器文件夹。
如果安装正确,则文件将在容器的目录c:\data
中列出。
答案 7 :(得分:0)
您需要将所有反斜杠交换为正斜杠 所以改变
docker -v C:\ my \ folder:/ mountlocation ...
到
docker -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
答案 8 :(得分:0)
这里是我的,它与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
答案 9 :(得分:-1)
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 / Users / Christian / manager
cmd 或 PowerShell
cd C:\Users\Christian\manager
echo ${PWD}
结果:
路径 ---- C:\ Users \ Christian \ manager
我们在 cmd 或 PowerShell 中看到的$ {PWD}不起作用