一時期はalpineに乗っかったMySQLを使おうとしましたがMariaDBだったので断念。
いくら互換だとはいえ、まだ自分には早い。
そんなわけでDocker MySQL公式イメージの5.5を利用してDBを構築。
初期データを投入した状態で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を置いておけば初回起動時に実行してくれるとのこと!
すごい行き届いている!
一応コードを確認してみるとこの辺ですね。
#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にローカルディレクトリをマウント
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で。
create database test_db1;
create database test_db2;
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
で初回起動時にデータが投入されます。素晴らしい!
というわけでなにかの役にたてば。