久々にdockerをいろいろ使ってみていたので(再入門レベル)ちょっと気になったことを書いてみる。
結論
-v
オプションではなく、--mount
オプションを使いましょう。
経緯
dockerを使っていると、-v
オプションでたまにフォルダ名をタイポしたりしていて、思ったとおりマウントできていなかった。
(あとWindowsの方使ってるとパスの表記でハマったりする。ドキュメントしっかり読めばいいだけなんですけどね)
例
docker run -it -v $(pwd)/somedisk:/hoge alpine sh
→ホスト側にsomedisk
というフォルダがなくても、コンテナ側にhoge
というフォルダは作られる。(中身は空)
$ docker run -it -v $(pwd)/somedisk:/hoge alpine sh
/ # ls
bin dev etc hoge home lib media mnt
opt proc root run sbin srv sys tmp usr var
docker run -it --mount type=bind,src=$(pwd)/somedisk,dst=/hoge alpine sh
→ホスト側にsomedisk
がないとエラー
$ docker run -it --mount type=bind,src=$(pwd)/somedisk,dst=/hoge alpine sh
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /home/user/docker/somedisk.
See 'docker run --help'.
調べた
https://github.com/moby/moby/pull/21666
https://github.com/moby/moby/issues/13121
以前は-v
で存在しないホスト側ディレクトリを指定すると勝手に作成していたみたい。
で、勝手に作成されないようになったんだけど、エラーは出たりしない、ということかな。
なので-v
は--mount type=bind,...
に変えて使いましょう。
Windows Docker Desktopでは
WSLからdocker.exe
を使う場合
$ docker.exe run -it --mount type=bind,src=$(pwd)/hoge,dst=/hoge alpine
C:\Program Files\Docker\Docker\resources\bin\docker.exe: Error response from daemon: invalid mount config for type "bind": bind source path does not exist:
windows形式のパスを指定しないとエラーになる。(wslのaptとかで入れるとエラーにならないのかも)
docker.exe run -it --mount type=bind,src=$(wslpath -w $(pwd)/hoge),dst=/hoge alpine
こんな風にwindowsのパスに変換しましょう。
ただし、記事時点のDocker Windowsではホストパスが存在しない場合は--mount
オプションでもホスト側にフォルダが勝手に作成される。
エラーも出ません。気をつけましょう。