主に開発用とで docker で MySQLを動かす際に、起動時にサンプルデータなど初期データを登録しておきたいことがあります。
docker の MySQL image では /docker-entrypoint-initdb.d/
というディレクトリ内に初期化用のSQLやスクリプトを置くことで、最初に image を起動したときにデータの初期化を自動的に行う仕組みがあります。
本記事ではその設定方法について簡単に記載します。
ディレクトリ構成
├ root
├ mysql
├ data
├ init
| ├ 1_ddl.sql
| ├ 2_data.sh
| └ data.csv
└ Dockerfile
└ docker-compose.yml
mysql
init/1_ddl.sql
table の作成などを行う SQL
CREATE DATABASE IF NOT EXISTS sada;
CREATE TABLE IF NOT EXISTS sada.masashi(
`id` int(11) NOT NULL,
`name` varchar NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
init/2_data.sh
CSVデータの import 処理を行う shell script
mysql -uroot -pmysql --local-infile sada -e "LOAD DATA LOCAL INFILE '/docker-entrypoint-initdb.d/data.csv' INTO TABLE masashi FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n'"
init/data.csv
CSV ファイル
"sada masashi"
...
Dockerfile
init ディレクトリの内容を、 /docker-entrypoint-initdb.d/ に copy するよう Dockerfile で記述します。
from mysql:5.6
COPY init/* /docker-entrypoint-initdb.d/
CMD ["mysqld"]
/docker-entrypoint-initdb.d/ の中のファイルは、1_, 2_ ...
などと数字で prefix が記されているファイルの昇順で実行されていきます。
root
docker-compose.yml
version: '3'
services:
mysql:
build: ./mysql
container_name: mysql56
environment:
MYSQL_ROOT_PASSWORD: mysql
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/init:/docker-entrypoint-initdb.d
ports:
- 3306:3306
起動
$ docker-compose build
(snip.)
$ docker-compose up
(snip.)
mysql56 | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/1_ddl.s
mysql56 | Warning: Using a password on the command line interface can be insecure.
mysql56 |
mysql56 |
mysql56 | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/2_data.
mysql56 | Warning: Using a password on the command line interface can be insecure.
ちょっとコマンド内で直接パスワード指定していたりとイケてないので上記例では warning が発生していますが、mysql の docker container が起動したタイミングで、データの初期化処理が行われているのが確認できます。
これで、docker をローカル環境で動かす際に、ただ起動するだけで MySQL に対してテーブルの作成やデータの投入まで行うことができます。