Skip to content

Instantly share code, notes, and snippets.

@mapk0y
Last active August 29, 2015 14:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mapk0y/77b8c7343a429cdf826a to your computer and use it in GitHub Desktop.
Save mapk0y/77b8c7343a429cdf826a to your computer and use it in GitHub Desktop.
docker-compose(旧fig) の volume の扱い

通常 docker は -v /foo としてコンテナを起動した後にそのコンテナを docker rm して、新たに docker run で作りなおすと /foo の中身は引き継がない。

しかし、docker-compose を利用するとこれが引き継がれる。なぜかを調べてみた(docker-compose は stop/start ではなくちゃんと作りなおしているので修正した設定などが反映される)。

通常

  1. -v で指定した場合(や Dockerfile の VOLUME で指定している場合) /var/lib/docker/vfs/dir に ID のディレクトリが掘られてそこが bind-mountされる
  2. 対象コンテナは rm されない限りここを参照する。
  3. 対象コンテナが rm されると紐付け(config.json)が消えるが、データは消されない(ただ当然どのコンテナからも通常アクセス出来ない)

docker-compose の場合

  1. 普通にコンテナを起動(通常の 1と同様
  2. コンテナを作りなおす際に、すぐに削除せずに entrypoint=/bin/echo としたコンテナを --volumes-from=1のコンテナ として起動する(/bin/echo なので直ぐに終了)
  3. 1 のコンテナを削除する。ただ、対象ディレクトリには 2のコンテナが紐付いている
  4. 新たなコンテナを --volumes-from=2のコンテナ で起動する。(1のコンテナと同じ場所が見える)
  5. 2のコンテナを削除する

つまり、間にテンポラリなコンテナを作り、2回 volumes-from をすることで以前のコンテナの volume を引き継ぐようになっている

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment