通常 docker は -v /foo としてコンテナを起動した後にそのコンテナを docker rm
して、新たに docker run
で作りなおすと /foo の中身は引き継がない。
しかし、docker-compose を利用するとこれが引き継がれる。なぜかを調べてみた(docker-compose は stop/start ではなくちゃんと作りなおしているので修正した設定などが反映される)。
- -v で指定した場合(や Dockerfile の VOLUME で指定している場合)
/var/lib/docker/vfs/dir
に ID のディレクトリが掘られてそこが bind-mountされる - 対象コンテナは rm されない限りここを参照する。
- 対象コンテナが rm されると紐付け(config.json)が消えるが、データは消されない(ただ当然どのコンテナからも通常アクセス出来ない)
- 普通にコンテナを起動(通常の 1と同様
- コンテナを作りなおす際に、すぐに削除せずに
entrypoint=/bin/echo
としたコンテナを--volumes-from=1のコンテナ
として起動する(/bin/echo なので直ぐに終了) - 1 のコンテナを削除する。ただ、対象ディレクトリには 2のコンテナが紐付いている
- 新たなコンテナを
--volumes-from=2のコンテナ
で起動する。(1のコンテナと同じ場所が見える) - 2のコンテナを削除する
つまり、間にテンポラリなコンテナを作り、2回 volumes-from をすることで以前のコンテナの volume を引き継ぐようになっている