事象:こんなことをしたかった
db:
image: mariadb:10.5.21
volumes:
- ./db/data:/var/lib/mysql
- ./db/init:/docker-entrypoint-initdb.d
(docker-compose.yml から抜粋)- MariaDBコンテナを作成
- docker-entrypoint-initdb.d でデータベースを作成
- 諸事情によりテーブルも docker-entrypoint-initdb.d で作成した方がよいと判断
- init用ファイルを書き換え
- docker-entrypoint-initdb.d を実行し直してデータベースとテーブルを作成し直し
これを書いてあるとおりに実行するとどうなるかというと、、docker-entrypoint-initdb.d はコンテナ作成時に1回だけ実行されるので、テーブルは作成されません。ファイルを更新してもダメなんですね。まあ確かに初期化スクリプトが何度も実行されたら困るし、わかるんですけどそこを何とか。
解決策:こうしたら実行してくれました
- docker-compose down で停止
- db/data 以下の全ファイルを削除(=全データが削除されます)
- docker-compose up –build -d で起動
早い話が作り直すということなのですが、何をどこまで削除したら行けるのかがわかりづらいんですよね。コンテナさえ削除すれば大丈夫かと思ったらそうでもない。かといってボリュームまで削除しなければならないかというとそれも違う。答えは「db/data 以下の全ファイルを削除する」でした。こうすることで Docker が「まだデータベースが作成されていない」と認識し、docker-entrypoint-initdb.d をもう一度実行してくれるようです。
「ボリュームを削除する」という情報もあったんですけど、それやって他のコンテナに影響があっても困るのでこっちの方が安心かな。ただデータベースのデータが消えることには変わりないので、もしデータは残したままやりたかったら……ま、その時は素直にSQLを実行するようにしましょう。docker-entrypoint-initdb.d はあくまで初期化ですからね。
そんな感じで。