web-dev-qa-db-ja.com

Windows 10上のDockerに現在のディレクトリをボリュームとしてマウントする

説明

私は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で現在のディレクトリをボリュームとしてマウントするための正しい構文は何ですか?

64
McGo

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
140
ETL

これはPowerShellで私のために働きます:

docker run --rm -v ${PWD}:/data Alpine ls /data
18
friism

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
5
ToastedSoul

すべてのバックスラッシュをフォワードスラッシュに交換する必要があるので変更してください。

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
0
Karl

このコマンドで修正できます。

docker run --rm -it -v ${PWD}:c:\data mirkohaaser/docker-clitools

{PWD}はホストの現在のフォルダです。 :の後はコンテナフォルダです。マウントが正しい場合、ファイルはコンテナ内のディレクタc:\dataにリストされます。

0
Blue Clouds

これは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
0
jseguillon