【Docker】MySQLコンテナのデータベースに初期データを入れたかった
やりたいこと
- ローカルで立ち上げたMySQLコンテナ内のデータベースに、初期データを作りたい
前提
- 公式イメージ(mysql:8.1.0)を使用
- Docker Compose使用
やったこと
/docker-entrypoint-initdb.d/
内の.sql
ファイルはコンテナ初回立ち上げ時に実行されるので、ここにCREATE TABLEやINSERT INTOする.sql
ファイルを入れておく
compose.yaml
- 自分の場合は
./mysql/ddl
配下に.sql
ファイルを入れたので、./mysql/ddl
と/docker-entrypoint-initdb.d/
をマウントした - ファイルは実行してほしい順の連番で作る
- アルファベット順ぽいけど、数字の連番なら確実なのでそうする
- 01_create_database.sql, 02_create_table.sql, 03_insert_data.sql ...
- 環境変数 MYSQL_DATABASEを指定していればその名前のデータベースが自動で作成されるので、CREATE DATABASEは別になくてもよい
- CREATE文は
CREATE DATABASE IF NOT EXISTS
にしておかないと、環境変数に指定したもの +.sql
ファイルのもので二重にデータベース作成しようとして怒られるので注意
- CREATE文は
version: '3.8' services: mysql: build: ./mysql/ tty: true restart: always ports: - "${MYSQL_PORT}:${MYSQL_PORT}" command: --default-authentication-plugin=mysql_native_password volumes: - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf - ./mysql/ddl/:/docker-entrypoint-initdb.d/ - mysql-data:/var/lib/mysql environment: MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_HOST: ${MYSQL_HOST} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} MYSQL_PORT: ${MYSQL_PORT} TZ: ${TZ} volumes: mysql-data:
実際のファイルたちは↓にあります github.com
メモ
- テーブルや投入データに変更があった場合は手動で実行する or イメージ消す or volume削除する……の対処が必要
- イメージやvolumeを削除した場合データもまるごと消えるので、ちゃんとした開発で使うときはマイグレーションの仕組みを作った方がよさそう(今回は立ち上げたかっただけなのでやらない)