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


132

説明

Hyper-Vを介してWindows 10でDockerバージョン1.12.5を使用しており、現在のパスでコマンドとしてコンテナー実行可能ファイルを使用したい。正常に動作しているDockerイメージをビルドしましたが、現在のパスをマウントするのに問題があります。アイデアは、エイリアスを作成してdocker run --rm [...]コマンドを実行し、現在のディレクトリでシステム全体で使用できるようにすることです。

セットアップ

「test」フォルダのあるドライブEがあり、その中に「windows host on folder」というフォルダがあり、コマンドが機能していることを示しています。Dockerfileはディレクトリを作成し、/dataそれをVOLUMEおよびWORKDIRとして定義します。

有するE:\testPowerShellのカレントディレクトリとして絶対パスとドッカーコマンドを実行し、Iは、コンテンツを見ることができます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でボリュームとして現在のディレクトリをマウントする正しい構文は何ですか?

回答:


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 2017

2
@cjsimon実際にあるように見えます... PowerShell $(pwd)がLinuxでも動作するようにサポートしているようです(私は-未テスト)
ETL

12
Git Bashでは、winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9またはのいずれかwinpty 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

@mistalaba Windows 10を使用している場合は、のDocker for Windows代わりに使用してみてくださいToolbox
Finlay Roelofs

2
@ finlay-roelofsありがとうございますが、Docker for WinはWin Proでのみ機能します。
ミスタラバ2018

9

Git Bash for Windows(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 docker run -v pwd -W:/ usr / share / data atomgraph / fuseki から動作しませんでした--file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklosファイルが見つかりません:C:/ tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl
MartynasJusevičius

私はそうしました(バッククォートを含む)、それはWindowsのgitbashを使用して問題なく動作しました
Thiago Cardoso

これはハイパーgitbashでも最初のオプションで動作することを確認できます
Andy

バックティックは、埋め込みコマンドを実行する効率の悪い方法です。より良い方法は、$(コマンド)を使用することであるのではなく`command`
Cティモシー

8
  1. Dockerデスクトップ(Docker for Windows)で[設定]を開きます。
  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の両方に互換性のある私のものです。悲しいことに、私はこれを書いています:)。

c:/の代わりに/ host_mnt / cを使用した方がよいことに気づくでしょう。c:/を使用したdocker-ce Win 10で時々問題が発生したためです。

$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に対する100万ドルの回答であることを確認したいと思います!!!! よくできました!誰の好奇心のためにも、次のように ${MOUNT_PATH}解決します/c/Program Files/Docker Toolbox
petrosmm '30

2

他の人から提供されたGit Bashの他のソリューションは、私にはうまくいきませんでした。どうやら現在、Git for Windowsにはバグ/制限があるようです。これこれを見てください。

この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ターミナル、ConEmu、GitBashでこれをテストしましたが、すべてがうまくいきました。


こんにちは、これは私が最終的にこれを機能させるのに役立ちました。MSYS_NO_PATHCONV=1コマンドオプションが必要な理由を知っていますか?そうしないと、宛先のマウントディレクトリが「c:/ tools / cmder / vendor / git-for-windows」でいっぱいになりました
オースティンL

1

このコマンドはそれを修正する必要があります。

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

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


1

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

docker -v C:\ my \ folder:/ mountlocation ...

docker -v C:/ my / folder:/ mountlocation ...

私は通常、フォルダーをマウントするコマンドスクリプトから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からDocker CLIを使用する場合はCmd.exe、を使用%cd%して現在のディレクトリをマウントします。

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

Git Bash(MinGW)

Git Bash(MinGW)からDocker CLIを使用すると、POSIXパス変換により、現在のディレクトリのマウントが失敗する場合があります。Linuxスタイルのパスから変換するときに、DockerマウントボリュームがWindowsパスの最後に; Cを追加します

接頭辞を付けて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 / Users / Christian / manager

cmdまたはPowerShell

  cd C:\Users\Christian\manager

echo ${PWD} 結果:

パス---- C:\ Users \ Christian \ manager

私たちが見るようにCMDまたはPowerShellの $ {PWD}は動作しません


4
また、英語で解決策の説明を書き込んでください。これは、StackOverflowが無料のコード作成サービスであるという誤解を解消するのに役立ちます。
ユンノシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.