🦘

実験:Docker のバインドマウントって階層化できるの?

2023/10/16に公開

実験

こんな感じのディレクトリ構成にしたかった。

[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

実験結果の解釈は以下。

  1. マウントしたディレクトリ /hoge の中に fuga を新たにマウントすることは可能であった。
  2. コンテナ側では想定した通りのディレクトリ構造になっていた。
  3. コンテナ側 /hoge の中で作成したファイルはホスト側 hoge の中に作成された。
  4. コンテナ側 /hoge の中に fuga があるように、ホスト側 hoge の中にも fuga が作成された。
  5. コンテナ側 /fuga の中で作成したファイルはホスト側 fuga の中に作成されたが、ホスト側 hoge/fuga の中には作成されなかった。

以上より、ホスト側 hoge の中にもマウントポイントとしてのディレクトリ fuga は作成されるが、その実体はホスト側 fuga をマウントしていることが分かる。

まぁ Linux マシンにおいてさまざまなデバイスが / 以下にマウントされていることを考えれば自明な挙動ではある。素直な挙動でよかった。

脚注
  1. 私の環境では sudo 時も環境変数 ${PWD} が引き継がれるように /etc/sudoers.d に設定を追加している。そのような設定をしていない人は ${PWD}jikken への絶対パスに置き換える。 ↩︎

Discussion