MySQL
Docker

Docker で MySQL 起動時にデータの初期化を行う

主に開発用とで 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 に対してテーブルの作成やデータの投入まで行うことができます。