docker-compose 時に mysql コンテナに二つ目DBを作ってリストアする sql を実行する

2023年3月27日

参考

方法

下記のディレクトリに .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 する。

YouTube

2023年3月27日