Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

moaikids
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした