🦘
実験:Docker のバインドマウントって階層化できるの?
実験
こんな感じのディレクトリ構成にしたかった。
[host] [container]
jikken/ (root)/
├ hoge/ -> └ hoge/
└ fuga/ -> └ fuga/
| ホスト側 | マウント先 |
|---|---|
~/jikken/hoge |
/hoge |
~/jikken/fuga |
/hoge/fuga |
つまりコマンドで言えば以下のコマンドが実行可能なのか & 実行した結果どうマウントされるのか?
$ docker run -it --rm \
-v ${PWD}/hoge:/hoge \
-v ${PWD}/fuga:/hoge/fuga \
ubuntu:latest /bin/bash
テレビの前のみんなも実行する前に挙動を予測してみよう!!
実験結果
Docker が使える適当な Linux マシンで以下のコマンドを実行した[1]。
(host)$ mkdir jikken
(host)$ cd jikken
(host)$ mkdir hoge fuga
(host)$ ls
fuga hoge
(host)$ sudo docker run -it --rm \
-v ${PWD}/hoge:/hoge \
-v ${PWD}/fuga:/hoge/fuga \
ubuntu:latest /bin/bash
(container)# ls
bin boot dev etc hoge home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
(container)# cd hoge
(container)# ls
fuga
(container)# touch piyo.txt
(container)# ls
fuga piyo.txt
(container)# cd fuga
(container)# ls
(container)# touch poyo.txt
(container)# ls
poyo.txt
(container)# exit
(host)$ ls hoge
fuga piyo.txt
(host)$ ls hoge/fuga
(host)$ ls fuga
poyo.txt
実験結果の解釈は以下。
- マウントしたディレクトリ
/hogeの中にfugaを新たにマウントすることは可能であった。 - コンテナ側では想定した通りのディレクトリ構造になっていた。
- コンテナ側
/hogeの中で作成したファイルはホスト側hogeの中に作成された。 - コンテナ側
/hogeの中にfugaがあるように、ホスト側hogeの中にもfugaが作成された。 - コンテナ側
/fugaの中で作成したファイルはホスト側fugaの中に作成されたが、ホスト側hoge/fugaの中には作成されなかった。
以上より、ホスト側 hoge の中にもマウントポイントとしてのディレクトリ fuga は作成されるが、その実体はホスト側 fuga をマウントしていることが分かる。
まぁ Linux マシンにおいてさまざまなデバイスが / 以下にマウントされていることを考えれば自明な挙動ではある。素直な挙動でよかった。
-
私の環境では
sudo時も環境変数${PWD}が引き継がれるように/etc/sudoers.dに設定を追加している。そのような設定をしていない人は${PWD}をjikkenへの絶対パスに置き換える。 ↩︎
Discussion