Open6

dockerのmysqlでdocker-entrypoint-initdb.dが実行されない問題の対応

GenGen

docker-entrypoint-initdb.dに初期化のsqlを置いたけど実行してくれない

GenGen

imageを完全に削除してからなら実行してくれた

GenGen

確かに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'

GenGen

名前付きvolumeを使うとうまくやれるかも、ということを教えてもらって以下を試した

  1. 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: # 名前付きボリュームを定義
  1. docker-compose down --volumeを使って必要に応じて作った名前付きvolumeを消す
GenGen

うまくできた。

まとめ

  • 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のスクリプトが実行される。