きなこもち.net

.NET Framework × UiPath,Orchestrator × Azure × AWS × Angularなどの忘備録

Docker for Windows × volumeオプション × パスの指定について

この記事の目的

この記事は、
Docker for WindowsでVolumeオプションを利用する時のパス指定の忘備録
を目的としています。

要約

検証した時点では、Docker for WindowsでVolumeオプションを利用する時は、

  • 絶対パス
  • ダブルクォーテーションで囲っても囲わなくてもいい
  • 区切り文字は、¥でも/でもいい

本題

リファレンスメモ

ボリューム関連コマンドは /engine/userguide/containers/dockervolumes セクション自身のドキュメントでも複雑なものです。開発者は1つまたは複数の VOLUME を作成し、イメージと関連づけることが可能です。しかし、作業者ができるのは、あるコンテナから別のコンテナに対してのみです(あるいは、コンテナからホスト側のボリュームにマウントする場合)。

コンテナ側ディレクトリ は /src/docs のように常に絶対パスの必要があります。 ホスト側ディレクトリ は絶対パスか 名前 を値に指定できます。 ホスト側ディレクトリ に絶対パスを指定する場合は、 Docker は指定したパスを拘束マウント(bind-mounts)します。 名前 を指定する場合は、Docker は 名前 を持つボリュームを作成します。

docs.docker.jp



検証)相対パス VS 絶対パス

相対パス
C:\>docker run  -v .\test:/test -d --name test004 postgres

docker: Error response from daemon: Mount denied:
The source path ".\\test"
is not a valid Windows path.
See 'docker run --help'.

→ パス指定エラーになります。

絶対パス
C:\Users>docker run  -v "C:/test":/test -d --name test004 postgres

dbc9225167bd1535700fe7938f54b867b83f56af964b2013b298fc07b400f2e4

→ 成功(/・ω・)/



検証)ダブルクォーテーションの有無

あり
C:\Users>docker run  -v "C:\test":/test -d --name test002 postgres

036ff6ee9f3b29e76b1e0328701a8c7a6d7ede037027ba8613cf48c95d4d824a

→ 成功(/・ω・)/

なし
C:\Users>docker run  -v C:/test:/test -d --name test003 postgres

e955d0b9fb3ce9d05e90641b22a946878b35d2e8a2fe3b0e702e78a02beb1e5d

→ 成功(/・ω・)/


検証)¥ VS /

円マーク
C:\Users>docker run  -v C:¥test:/test -d --name test001 postgres

036ff6ee9f3b29e76b1e0328701a8c7a6d7ede037027ba8613cf48c95d4d824a

→ 成功(/・ω・)/

スラッシュ
C:\Users>docker run  -v C:/test:/test -d --name test003 postgres

e955d0b9fb3ce9d05e90641b22a946878b35d2e8a2fe3b0e702e78a02beb1e5d

→ 成功(/・ω・)/



まとめ(バッチファイル化するときのアイディアメモ)

絶対パスを指定しないといけないけど、バッチ化するときに絶対パスを埋め込むとメンテナンスが大変なので、何とかしようとした結果、以下のようになりました。

#1つのディレクトリをマウントするとき
docker run  -v %cd%:/test -d --name test005 postgres
#複数つのディレクトリをマウントするとき
#カレントディレクトリ
#├─mount dir 1
#│  └─なんかファイル
#├─mount dir 2
#│  └─なんかファイル
#└─このバッチファイル.bat

docker run  -v %cd%/mountdir1:/test1  -v %cd%/mountdir2:/test2 -d --name test005 postgres