1. alt

    シンタックスハイライト

    alt
Changes in body
Source | HTML | Preview
@@ -1,97 +1,96 @@
主に開発用とで 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
-```
+```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
-```
+```sh
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 で記述します。
-```
+```Dockerfile
from mysql:5.6
COPY init/* /docker-entrypoint-initdb.d/
CMD ["mysqld"]
```
/docker-entrypoint-initdb.d/ の中のファイルは、`1_, 2_ ...` などと数字で prefix が記されているファイルの昇順で実行されていきます。
## root
-```
-docker-compose.yml
+```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
```
# 起動
-```
+```console
$ 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 に対してテーブルの作成やデータの投入まで行うことができます。