mysql の Docker イメージを使用すると、mysqldump スクリプトを特定のフォルダーに配置することができ、初回起動時にそれらのスクリプトを使用して空のデータがロードされます。
私が知りたいのは、初期データのロードを待たずに、ビルドの一部としてその実行がすでに行われているイメージを作成する方法です。
このイメージの目的は、ローカルテスト用のデータベースの開発者用コピーを作成することです。
可能であれば、ビルド サーバーに MySQL をインストールせずにビルドできるように、マルチステージ Docker ビルドとして実行したいと思います。
まだ試していませんが、私の一般的な思考プロセスは次のとおりです。
FROM mysql as builder
COPY *.sql /somefolder
COPY buildscript.sh /buildscript.sh
FROM mysql
COPY --from build /var/lib/mysql /data # to avoid using the volume folder
そして、buildscript.sh
次のようなことをする
- mysqldを起動する
- mysqld が完全に起動するまで待ちます (??)
- データを構築するために使用されたSQLを実行する
- mysqldをシャットダウンする
- 同期(すべてのファイルが書き込まれていることを確認してください)
答え1
エントリ ポイントで操作を実行する代わりに、Dockerfile でこれを行うことは可能だと思います。データベース データをイメージにコピーし、そのデータを保存したディレクトリを指すように my.cnf を構成して、エントリ ポイントへのダンプ操作をスキップする必要があります。とにかく、個人的な考慮事項として、これによってどのような利点が得られますか? つまり、実行時にデータベースを作成してデータを入力するのを待つ必要はありませんが、イメージを再度ビルドするたびに時間がかかり、一部のデータが含まれるためイメージも大きくなります。イメージを頻繁に再構築する予定がある場合は、時間コストが大きく変わらないことを考慮する必要があります。イメージを頻繁に再構築する予定がない場合は、利点になる可能性があります。
答え2
これが私の現在の解決策です。
まず、Dockerfile
FROM mysql:5.7.23 as prep
COPY *.sql /docker-entrypoint-initdb.d/
COPY scripts/build-db.sh /
ARG MYSQL_ROOT_PASSWORD=my-very-secret
ARG MYSQL_USER=sampleuser
ARG MYSQL_PASSWORD=password123
RUN chmod u+x /build-db.sh
RUN /build-db.sh
FROM mysql:5.7.23
# use /data in my case so that it uses a directory that is not a VOLUME
COPY --from=prep /data /data
build-db.sh
次に、既存のものを取得するセットを追加しますエントリポイント最後の行を削除して、初期化が完了したら停止するようにします。デフォルトではビルドの次の段階でデータが含まれないためexec
、データが挿入されます。/data
/var/lib/mysql
#!/bin/bash
head -n -1 /usr/local/bin/docker-entrypoint.sh > /d2.sh
chmod +x /d2.sh
exec /d2.sh --datadir=/data
--datadir=/data
起動するには、ボリューム以外のディレクトリを使用する必要があります。