準備済みのデータベーススキームを使用したdocker mysqlコンテナーの作成


17

私のアプリに必要なスキームがすでに含まれているmysqlの上にdockerイメージを作成したいと思います。

スキームをsqlファイルとしてインポートする行をDockerfileに追加しようとしました。私はそのようにしました(私のDockerfile):

FROM mysql

ENV MYSQL_ROOT_PASSWORD="bagabu"
ENV MYSQL_DATABASE="imhere"

ADD imhere.sql /tmp/imhere.sql

RUN "mysql -u root --password="bagabu" imhere < /tmp/imhere.sql"

私の理解では、mysqlドッカーイメージにはmysqlクライアントが含まれていないため、これは機能しませんでした(ベストプラクティスでは、「持っていると便利だからといって追加しないでください」)(これは間違っていますか?)

これを行うための良い方法は何でしょうか?私はいくつかのことを念頭に置いていましたが、それらはすべて厄介な回避策のように見えます。

  1. mysqlクライアントをインストールし、私がしなければならないことをしてから、それを削除/パージします。
  2. mysqlクライアントバイナリをイメージにコピーし、必要な処理を行ってから削除します。
  3. 別のSQLサーバーでスキーマを作成し、dbファイル自体を直接コピーします(これは非常に面倒で、汚染された問題のプールのように聞こえます)

助言がありますか?後ほど簡単に維持でき、おそらくベストプラクティスにも準拠する方法で願っています。


回答:


14

initスクリプトは次のようにマウントされたディレクトリに配置する必要/docker-entrypoint-initdb.dがあります-MySQL Dockerイメージドキュメントの「Initializing a fresh instance」セクションを参照してください。


2
これは、新しいコンテナを作成し、スキーマにロードするために機能します。どちらが良い方法ですが、既にスキーマがプリインストールされている独自のドッカーイメージを作成する方法を探している場合はどうでしょうか。
トムクリノ

実際には、決して気にしないでください:-)私/docker-entrypoint-initdb.dはホストにあると思っていましたが、実際にはコンテナにあります。ADDコマンドを変更してそのディレクトリにコピーし、コマンドを削除しましたRUN。Dockerはイメージを正常に作成し、テストしましたが動作します。
トムクリノ

14

私はテストのためにこれをしなければなりませんでした。

dockerhubの実際のMySQL / MariaDBイメージとマルチステージビルドを活用して、次のようにしました。

FROM mariadb:latest as builder

# That file does the DB initialization but also runs mysql daemon, by removing the last line it will only init
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]

# needed for intialization
ENV MYSQL_ROOT_PASSWORD=root

COPY setup.sql /docker-entrypoint-initdb.d/

# Need to change the datadir to something else that /var/lib/mysql because the parent docker file defines it as a volume.
# https://docs.docker.com/engine/reference/builder/#volume :
#       Changing the volume from within the Dockerfile: If any build steps change the data within the volume after
#       it has been declared, those changes will be discarded.
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db", "--aria-log-dir-path", "/initialized-db"]

FROM mariadb:latest

COPY --from=builder /initialized-db /var/lib/mysql

完全な作業例はこちら:https : //github.com/lindycoder/prepopulated-mysql-container-example


2
私がインターネット全体で見つけた最良の答えは、私のものはpostgresのためだったので、それはもう少し難しいものでしたが、最終的には機能しました。そして、それは完璧に機能します!
snowe2010

古いバージョンのmysql(5.7.9)では、/ entrypoint.shにシンボリックリンクされた/usr/local/bin/docker-entrypoint.shがなく、代わりに/にentrypoint.shがあります。/usr/local/bin/docker-entrypoint.shを/entrypoint.shに変更することは機能し、おそらく「最新の」リリースでも機能するはずです。
マービン

2

@Martin Royのクレジット

mysqlで動作するようにマイナーな変更を行いました...

コンテンツDockerfile

FROM mysql:latest as builder

# That file does the DB initialization but also runs mysql daemon, by removing the last line it will only init
RUN ["sed", "-i", "s/exec \"$@\"/echo \"not running $@\"/", "/usr/local/bin/docker-entrypoint.sh"]

# needed for intialization
ENV MYSQL_ROOT_PASSWORD=root

COPY setup.sql /docker-entrypoint-initdb.d/

# Need to change the datadir to something else that /var/lib/mysql because the parent docker file defines it as a volume.
# https://docs.docker.com/engine/reference/builder/#volume :
#       Changing the volume from within the Dockerfile: If any build steps change the data within the volume after
#       it has been declared, those changes will be discarded.
RUN ["/usr/local/bin/docker-entrypoint.sh", "mysqld", "--datadir", "/initialized-db"]

FROM mysql:latest

COPY --from=builder /initialized-db /var/lib/mysql

コンテンツsetup.sql

CREATE DATABASE myexample;

USE myexample;

CREATE TABLE mytable (myfield VARCHAR(20));

INSERT INTO mytable VALUES ('Hello'), ('Dolly');

完全な作業例はこちら:https : //github.com/iamdvr/prepopulated-mysql-container-example


-1

Ansibleなどの管理ソフトウェアを使用すると、クライアントをインストールおよび再インストールする必要なく、mysqlインポートを簡単に自動化できます。Ansibleには、Dockerイメージとコンテナー、およびmysqlデータベースを管理する優れた組み込み機能があります。


それは興味深いです-Ansibleを使用しましたが、Dockerイメージには使用していません。パトリック、例を挙げて答えを拡張できますか?
グレッグドゥビッキ

Ansibleには素晴らしいドキュメントページがあり、このURLでAnsibleモジュールを見つけることができます:docs.ansible.com/ansible/docker_module.html このガイドのモジュールの章の各ページにはいくつかの例があります。
パトリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.