やりたいこと
docker-compose最初の起動時にDB複数作りたいです。
docker-compose.ymlにて、environmentでYSQL_DATABASEにDBを指定するとそのDBを初回起動時に作成してくれますが、複数DBやダンプしたデータの流し込みには対応していません。
MySQL(Docker Official Images)では/docker-entrypoint-initdb.d
というディレクトリに入っているSQLやシェルスクリプトが初回起動時に実行されるようになっているので、そこに色々入れて実行してもらおうと思います。
MYSQL_DATABASEで作成したDBに対してしか実行出来ないので、作成した別のDBをUSE
します。
〜やろうとしていることの流れ〜
1. DB1作る
2. DB1にダンプしたSQL流し込み
3. DB2作る
4. DB2をUSEする
5. DB2ダンプしたSQL流し込み
docker-entrypoint-initdb.dについて
このディレクトリに入っている.sh
、.sql
、.sql.gz
いずれか拡張子を持つファイルがアルファベット順に実行されます。
それ以外の拡張子のファイルは無視されます。
構成
ディレクトリ
├── docker-compose.yml
└── mysql
├── Dockerfile
├── dbdata
└── initdb
├── 001.sql
├── 002.sh
└── 003.sql
docker-compose.yml
services:
mysqldata:
image: busybox
volumes:
- ./mysql/dbdata:/var/lib/mysql
mysql:
build: ./mysql
volumes_from:
- mysqldata
ports:
- 4306:3306
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=db_1
volumes:
- ./mysql/initdb:/docker-entrypoint-initdb.d
- MYSQL_DATABASEで
db_1
を作成 -
docker-entrypoint-initdb.d
を./mysql/initdb
にマウントします
dockerfile
FROM mysql:5.7
イメージ指定するだけ。
001.sql
db_1に流し込むダンプしたSQL。
002.sh
#!/bin/sh
echo "CREATE DATABASE IF NOT EXISTS \`db_2\` ;" | "${mysql[@]}"
- db_2を作成
-
${mysql[@]}
= 引数付きのmysql
コマンドを展開しています- docker-entrypoint.shで中身が確認出来ます
003.sql
USE db_2;
/*以下db_2に流し込むダンプデータ*/
USE
コマンドはファイルをまたぐと無効になるので、ダンプデータの先頭に必要です。
$ cat header.sql 003.sql > 003_new.sql
// コマンドで合成するなら
おわり
他にもdb_2へのダンプするSQLファイルをtxt形式など(自動で実行されない形式)で設置しシェル上で流し込みを実行するやり方や、csvファイルで設置して流し込みするやり方があるようです。
個人的にはシェル上ででDBの作成だけをするやり方が楽が好きですが、
- DBが増えるとファイルが増えて複雑になる
- .sql.gz形式の時は先頭に
USE
を挿入出来ない
ので使い所は限られるかと思います。