docker-compose 時に mysql コンテナに二つ目DBを作ってリストアする sql を実行する
参考
- docker-composeでmysql使うとき初回起動時に複数のDBを作る方法
- dockerのmysqlでdocker-entrypoint-initdb.dが実行されない問題の対応
- MySQL と MariaDB の Docker イメージでコンテナー起動時にサブディレクトリー内の SQL ファイルを読み込む
方法
下記のディレクトリに .sh .sql .sql.gz を配置すると初回コンテナを立ち上げた時に起動してくれるよう。なので今回は volume を使って .sh を配置して sql を実行して表題の件を実現してみる。
docker-entrypoint-initdb.d
先に注意どころ
1.権限
権限がきついとパーミッションで弾かれるので変更する。
chmod 755 -R docker-entrypoint-initdb.d/
2.ボリューム
volume が残っていると実行されないとのことなので削除する。
参考の記事によるとデータが消えると記載があるので注意する。ただ後述する永続化をしていれば初期化はされなかった。
docker-compose down --volumeを使う。名前付きボリュームが消えてDBが完全初期化されるので注意。
docker-compose down -v
下記のコマンドで volume の一覧を確認できる。
docker volume ls
下記のように、docker-compose の volume でデータを永続化している場合は、マウントしている mysql ディレクトリを削除しないと実行されない。
volumes:
- ./mysql:/var/lib/mysql
なので「docker-compose down → docker-compsoe up」し直しても sql が実行されて初期化されることはないよう。
3.実行されるファイルは、直下のファイルのみ
直下のファイルしか実行されないので、下記のような階層だと hoge.sh は実行されるが fuga.sh は実行されないので注意。
docker-entrypoint-initdb.d
├── hoge.sh
└── dir
└── fuga.sh
やってみる
今回は hoge_database と fuga_database を作成してそれぞれリストアしてみます。
階層
ここから本題。
階層は下記の通り。
├── dockerfile
├── docker-compose.yml
└── sql
├── init.sh
└── dumpdatas
├── hoge_2000-01-01.sql
└── fuga_2000-01-01.sql
dumpdatas 配下にはダンプデータを配置している。
前述の通り dumpdatas 配下のファイルは、拡張子が sql になっているが直下に配置されていないので実行はされない。
dockerfile
権限の変更は今回 dockerfile に記載しておく。
RUN chmod 755 -R docker-entrypoint-initdb.d/
docker-compose.yml
docker-compose.yml は下記の通り。
environment:
MYSQL_DATABASE: hoge_database
MYSQL_USER: user_name
MYSQL_PASSWORD: user_password
MYSQL_ROOT_PASSWORD: root_password
volumes:
- ./sql:/docker-entrypoint-initdb.d
- ./mysql:/var/lib/mysql
hoge_database は、docker-compose の定義で作っておく。
その他ユーザーなども。
sql を docker-entrypoint-initdb.d にマウントする。
これで sql 直下に置いたファイル init.sh が実行される。
mysql のマウントは、DBの永続化の為。
init.sh
実行されるスクリプトは下記の通り。
#!/bin/bash
# ダンプファイルのパスを取得する。
dumpdata_path_hoge=`find "/docker-entrypoint-initdb.d/" -name "hoge_*.sql" -type f`
dumpdata_path_fuga=`find "/docker-entrypoint-initdb.d/" -name "fuga_*.sql" -type f`
# fuga_database を作成し、ユーザーに権限を付与する。(※ hoge_database は、docker-compose で作成しているので不要。)
mysql -uroot -proot_password -e "create database fuga_database;"
mysql -uroot -proot_password -e "grant all on fuga_database.* to user_name@'%';"
# リストアする。
mysql -uuser_name -puser_password hoge_database < $dumpdata_path_hoge;
mysql -uuser_name -puser_password fuga_database < $dumpdata_path_fuga;
少々雑ですが、ダンプファイルの日付部分は変わる可能性があるので * にしています。
あとは docker-compose up する。
ディスカッション
コメント一覧
まだ、コメントがありません