説明
私はHyper-Vを介してWindows 10上でDockerバージョン1.12.5を使用しています。現在のパスのコマンドとしてコンテナー実行可能ファイルを使用したいです。正常に動作しているDockerイメージを作成しましたが、現在のパスをマウントするのに問題があります。これは、現在のディレクトリでシステム全体で使用できるように、エイリアスを作成してdocker run --rm [...]
コマンドを実行することです。
セットアップ
コマンド "E"が動作していることを示すために、 "test"というフォルダと "Windows Host上のフォルダ"というフォルダがあるドライブEがあります。 Dockerfileはディレクトリ/data
を作成し、それをVOLUMEとWORKDIRとして定義します。
PowerShellの現在のディレクトリとしてE:\test
を持ち、絶対パスを指定して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のコマンドライン(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
これはPowerShellで私のために働きます:
docker run --rm -v ${PWD}:/data Alpine ls /data
Git Bash for Windows(ConEmu)では、私には以下のように動作します(Docker Windowsコンテナ用)。
docker run --rm -it -v `pwd -W`:c:/api Microsoft/dotnet:2-runtime
backticks/backquotespwd -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
すべてのバックスラッシュをフォワードスラッシュに交換する必要があるので変更してください。
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
このコマンドで修正できます。
docker run --rm -it -v ${PWD}:c:\data
mirkohaaser/docker-clitools
{PWD}はホストの現在のフォルダです。 :
の後はコンテナフォルダです。マウントが正しい場合、ファイルはコンテナ内のディレクタc:\data
にリストされます。
これはWin10 docker-ceとWin7 docker-toolboxの両方に互換性のある私のものです。当時私はこれを書いています:)。
あなたは私が時々c:/でdocker-ce Win 10でトラブルに遭遇したので私がc:/の代わりに/ Host_mnt/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