LoginSignup
2
1

More than 3 years have passed since last update.

docker-composeのmysqlで起動時に複数DB作るしダンプしたSQLデータも流し込むメモ

Posted at

やりたいこと

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

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

dockerfile
FROM mysql:5.7

イメージ指定するだけ。

001.sql

db_1に流し込むダンプしたSQL。

002.sh

002.sh
#!/bin/sh

echo "CREATE DATABASE IF NOT EXISTS \`db_2\` ;" | "${mysql[@]}"
  • db_2を作成
  • ${mysql[@]} = 引数付きのmysqlコマンドを展開しています
    • docker-entrypoint.shで中身が確認出来ます

003.sql

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を挿入出来ない

ので使い所は限られるかと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1