永続化関連のまとめと遭遇したトラブル
- コンテナを削除 (docker rm や docker-compose down など) しても、volumes のホスト側のファイルは残る。
- MySQL の /docker-entrypoint-initdb.d/ に置いた SQL ファイルは、コンテナを作成 (1回目) してコンテナを削除して、コンテナを作成 (2回目) した場合、1 回目しか実行されない。
- 1 回目で永続化されたファイルが出来上がり、これは削除されない。すると 2 回目では永続化された DB ファイルがあるため、実行されないのであろう。
- したがって、開発中などの場合、永続化の設定をした状態で 2 回目のコンテナを作成する前に /docker-entrypoint-initdb.d/ の SQL を編集してもその内容はコンテナに反映されない。
- 永続化したファイルを消せば、コンテナに反映される。
volumes に定義したデータの確認と削除
docker-compose トップレベルの volumes 内に定義した永続化データを調べて消すには次のようにしました。
# 確認 docker volume ls # 使用されていない volume をすべて削除 docker volume prune
おわりに
永続化した mysql コンテナを作成して削除して、次に mysql イメージのバージョンを変えてコンテナを作成したとき、PHP から MySQL へアクセスするとエラーとなりました。
なぜだろうと思いつつも、docker-compse.yml を含むディレクトリを削除して別の名前のディレクトリで作り直すと、1 回目はエラーとならず、2 回目はエラーと、再現しました。
予想するに、volumes はパスと密接に関わっており、パスを変えると volumes がリセットされたのでしょう。
なんにせよ、開発中は特に、volumes について意識しなければなりませんね。
次のページが参考になりました。ありがとうございます!
以上です。