Open6
dockerのmysqlでdocker-entrypoint-initdb.dが実行されない問題の対応
docker-entrypoint-initdb.dに初期化のsqlを置いたけど実行してくれない
imageを完全に削除してからなら実行してくれた
mysqlのdocker entrypointスクリプトを確認するとDBが存在するとdocker-entrypoint-initdb.dは実行してれないらしい。
確かにmysqlのDBファイルなどはローカルに同期させていた(バインドマウントっていうのね)
db:
container_name: mysql-local
image: mysql:8
volumes:
- ./docker/local/db/my.cnf:/etc/mysql/conf.d/my.cnf
- ./docker/local/tmp/mysql:/var/lib/mysql # <- これ
- ./docker/local/db/initDb.sql:/docker-entrypoint-initdb.d/initDb.sql
ports:
- '3306:3306'
名前付きvolumeを使うとうまくやれるかも、ということを教えてもらって以下を試した
- DBファイルの保存場所に名前付きボリュームを使う
db:
container_name: mysql-local
image: mysql:8
volumes:
- ./docker/local/db/my.cnf:/etc/mysql/conf.d/my.cnf
- mysql-local:/var/lib/mysql # 名前付きボリュームを使う
- ./docker/local/db/initDb.sql:/docker-entrypoint-initdb.d/initDb.sql
(中略)
volumes:
mysql-local: # 名前付きボリュームを定義
-
docker-compose down --volume
を使って必要に応じて作った名前付きvolumeを消す
うまくできた。
まとめ
- mysqlのdockerを使う時にDB初期化したい時はsh/sqlを
/docker-entrypoint-initdb.d
配下に置く - 名前付きvolumeをdocker-composeで設定し、コンテナの
/var/lib/mysql
に紐づける - 起動時は普通に
docker-compose up
を使う。 - 普段のコンテナ停止は
docker-compose down
を使う。 -
/docker-entrypoint-initdb.d
のスクリプトを再実行したくなったら、docker-compose down --volume
を使う。名前付きボリュームが消えてDBが完全初期化されるので注意。 - 再度 upすれば
/docker-entrypoint-initdb.d
のスクリプトが実行される。