140
93

More than 5 years have passed since last update.

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

Posted at

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

140
93
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
140
93