LoginSignup
161
128

More than 5 years have passed since last update.

Docker MySQL公式イメージを使用してDBに初期データを流し込む

Last updated at Posted at 2016-09-30

一時期はalpineに乗っかったMySQLを使おうとしましたがMariaDBだったので断念。
いくら互換だとはいえ、まだ自分には早い。

そんなわけでDocker MySQL公式イメージの5.5を利用してDBを構築。

公式イメージ
https://hub.docker.com/_/mysql/

初期データを投入した状態でgithubにpushしようとしたら、rejectされてしまいました。
調べてみるとGithubのファイルサイズ制限にひっかかった模様

Working with large files
https://help.github.com/articles/working-with-large-files/

1ファイルあたり100MBまでとのこと。
InnoDBのibdata1がサイズ制限を超過していたのでした。かなりデータを厳選したんだけどな〜。
初期データインポートに使用したdumpファイルはせいぜい10MB程度なので、これを使ってDocker起動時に初期データを投入する方向で調べました。

すると公式イメージには便利機能が!

によれば

Initializing a fresh instance
When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions .sh, .sql and .sql.gz that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. You can easily populate your mysql services by mounting a SQL dump into that directory and provide custom images with contributed data.

/docker-entrypoint-initdb.dに.sqlや.shを置いておけば初回起動時に実行してくれるとのこと!
すごい行き届いている!

一応コードを確認してみるとこの辺ですね。

docker-entrypoint.sh
#108行目付近
for f in /docker-entrypoint-initdb.d/*; do
    case "$f" in
        *.sh)     echo "$0: running $f"; . "$f" ;;
        *.sql)    echo "$0: running $f"; "${mysql[@]}" < "$f"; echo ;;
        *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${mysql[@]}"; echo ;;
        *)        echo "$0: ignoring $f" ;;
    esac
    echo
done

というわけで、docker-compose.ymlで/docker-entrypoint-initdb.dにローカルディレクトリをマウント

docker-compose.yml
mysql:
  image: mysql:5.5
  volumes:
    - "./mysql:/var/lib/mysql"
    - "./mysql/init:/docker-entrypoint-initdb.d"
  environment:
    - MYSQL_ROOT_PASSWORD=password

./mysql/initにDBクリエイト用SQLとデータインポート用shを置いておいきます。
ちなみにasciiコード順に実行されるっぽいので、実行したい順番に頭に数字のプレフィクスを付けておくとわかりやすくてよし。

+ docker-compose.yml
+- mysql
    +- init
        + 1_create_db.sql
        + 2_import.sh
        + dump1.gz
        + dump2.gz

初期DBをひとつ構築するだけなら、docker-compose.ymlでもできるけど、複数構築したいので、sqlで。

1_create_db.sql
create database test_db1;
create database test_db2;
2_import.sh
cd /docker-entrypoint-initdb.d/
echo "import data1..."
gzip -dc ./dump1.gz | mysql -h localhost -u root -ppassword -P 3306 test_db1

echo "import data2..."
gzip -dc ./dump2.gz | mysql -h localhost -u root -ppassword -P 3306 test_db2

echo "done."

docker-compose up -dで初回起動時にデータが投入されます。素晴らしい!

というわけでなにかの役にたてば。

161
128
2

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
161
128