Docker で MySQL を起動したときに SQL 文を自動的に実行する方法

Docker で MySQL を起動したときに SQL 文を自動的に実行する方法

Docker で MySQL コンテナを作成する場合、コンテナの起動後にデータベースとテーブルが自動的に作成され、初期化データが自動的に入力されることを期待することがあります。つまり、コンテナの起動後、コンテナ内のデータベースに直接接続して、その中のデータを使用することができます。

実際、MySQL の公式イメージはこの機能をサポートしており、コンテナの起動時に指定された SQL スクリプトまたはシェル スクリプトを自動的に実行します。以下に示すように、MySQL の公式イメージの Dockerfile を見てみましょう。

ENTRYPOINT が設定され、 /entrypoint.shスクリプトが呼び出されます。mysql:8 イメージをローカル コンピューターにプルし、docker run で起動します。entrypoint.sh entrypoint.shの内容を見てみましょう。以下に示すように、固定ディレクトリ内の .sh および .sql サフィックスを持つすべてのファイルを走査して実行するセクションがあります。

原理を理解したので、実践してみましょう。

docker で disconf 環境を構築する場合、mysql データベースを構築し、4 つの sql ファイルを順番に実行して、それぞれデータベース、テーブル、データを初期化する必要があります。これを行うには 2 つの方法があります。

  • 4 つの SQL ファイルを/docker-entrypoint-initdb.dディレクトリにコピーすると、コンテナの実行時に 4 つの SQL が自動的に実行されるようになります。ただし、スクリーンショットのスクリプトからは、複数のファイルの実行順序を指定できません。データベースを作成するスクリプトをテーブルを作成するスクリプトよりも後に実行すると、テーブルの作成が失敗します。したがって、この SQL のコピー方法ではニーズを満たすことができません (ただし、4 つのファイルを順番に 1 つの SQL に結合すると、要件を満たすことができます)。
  • sh ファイルを作成し、必要に応じて sql を実行します。内容は次のとおりです。
#!/bin/bash
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
ソース $WORK_PATH/$FILE_0;
ソース $WORK_PATH/$FILE_1;
ソース $WORK_PATH/$FILE_2; 
ソース $WORK_PATH/$FILE_3;

シェルは非常にシンプルであることがわかります。mysql にログインし、指定された sql ファイルを実行します。MYSQL_ROOT_PASSWORD、WORK_PATH、FILE_0 はすべて環境変数です。

次のように、対応する Dockerfile の書き方を見てみましょう。

# disconf mysql の Docker イメージ
# バージョン 0.0.1
# 著者: bolingcavalry

#基本イメージはdaocloud.io/library/mysql:8を使用します
daocloud.io/library/mysql:8 から

#著者メンテナー BolingCavalry <[email protected]>

#作業ディレクトリを定義する ENV WORK_PATH /usr/local/work

#コンテナによって自動的に実行されるディレクトリを定義します ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d

#SQLファイル名を定義します ENV FILE_0 0-init_table.sql
ENV FILE_1 1-init_data.sql
環境変数 FILE_2 20151225.sql
環境変数 FILE_3 20160701.sql

#シェルファイル名を定義する ENV INSTALL_DATA_SHELL install_data.sh

#フォルダを作成する RUN mkdir -p $WORK_PATH

#データベース初期化データファイルを作業ディレクトリにコピーします COPY ./$FILE_0 $WORK_PATH/
コピー ./$FILE_1 $WORK_PATH/
コピー ./$FILE_2 $WORK_PATH/
コピー ./$FILE_3 $WORK_PATH/

#実行するシェルファイルを/docker-entrypoint-initdb.d/ディレクトリに置くと、コンテナは自動的にこのシェルを実行します
コピー ./$INSTALL_DATA_SHELL $AUTO_RUN_DIR/

#実行ファイルに実行権限を追加する RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_DATA_SHELL

0-init_table.sql、1-init_data.sql、20151225.sql、20160701.sql は実行する SQL ファイルであり、Docker イメージを構築するときにイメージ ファイルにコピーされます。

完全なコンテンツについては、私の github をクローンしてください: [email protected]:zq2599/docker_disconf.git 。クローン後、内部の mysql フォルダーに入り、このフォルダーでコマンド ラインdocker build -t disconf_mysql:0.0.1を実行してイメージをビルドします。

次に、 docker run –name mysqldisconf -e MYSQL_ROOT_PASSWORD=123456 -idt disconf_mysql:0.0.1を実行してコンテナを起動し、 docker logs -f mysqldisconfを実行してコンテナ ログを表示します。以下の赤いボックスに示すように、指定した場所に書き込んだ sh ファイルが実行されたことが分かります。

データベースにアクセスして、データが本当に存在するかどうかを確認しましょう。docker docker exec -it mysqldisconf /bin/bashを実行してコンテナに入ります。

mysql -uroot -p123456を実行して MySQL にログインした後の操作は次のようになります。

ご覧のとおり、 show databases,show tables,select * from appの操作により、コンテナの作成後に SQL が自動的に実行され、目的が達成されたことが証明されます。

要約する

以上が、Docker で MySQL が起動したときに SQL 文を自動的に実行する方法についてご紹介しました。お役に立てれば幸いです。ご質問がある場合は、メッセージを残していただければ、すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

以下もご興味があるかもしれません:
  • DockerがMySQL構成実装プロセスを開始
  • docker mysqlの起動時に初期化SQLを実行する
  • Docker での MySQL の初期化と起動の失敗の解決策
  • Mac で Docker を使用して MySQL テストをすばやく開始する方法
  • Dockerコンテナの起動時にMysqlデータベースを初期化する方法
  • Dockerはmysqlサービスの実装手順を開始します

<<:  MySQLの一般クエリログとスロークエリログの分析

>>:  MySQL 8.0 のインストール中に発生した 3 つの小さなエラーの概要

推薦する

MySQLにおけるビューの作成(CREATE VIEW)と使用制限の詳しい説明

この記事では、例を使用して、MySQL ビューの作成 (CREATE VIEW) と使用上の制限につ...

MySql 5.7.17 無料インストール構成チュートリアルの詳細な説明

1. mysql-5.7.17-winx64.zip インストール パッケージをダウンロードします ...

Firefox ブラウザでバックグラウンド ミュージックを再生するための究極のソリューション (Chrome マルチブラウザ対応)

FirefoxでBGMを再生するための推奨コードがテストに合格しました空のコントロールパネルを開いて...

Vueで親子コンポーネント通信を実装する方法

目次1. 親コンポーネントと子コンポーネントの関係2. 小道具3. $エミット4. $親V. 結論 ...

HTML における水平および垂直の中央揃え方法の詳細な説明 (基礎)

序文馬を書いていたとき、水平方向と垂直方向の中央揃えの方法について、誰もあまり知らなかったと思います...

JavaScript初心者がよく犯す間違い

目次序文undefined と null の混同紛らわしい数値の加算と文字列の連結戻り文の改行の問題...

初心者向けMySQLシリーズチュートリアル

目次1. 基本概念と基本コマンド1) 基本的な概念2) 基本コマンド2. SQL文の記述順序と実行順...

CSS を使用して固定左列と適応右列の 2 列レイアウトを実現する 4 つの方法

1. フロート+オーバーフロー:非表示このメソッドは主にオーバーフローを通じて BFC をトリガーし...

mysql8.0.19 winx64バージョンのインストール問題を解決する

MySQL は、スウェーデンの会社 MySQL AB によって開発されたオープンソースの小規模なリレ...

Spring Boot 2.4 の新機能、ワンクリックビルド、Docker イメージプロセスの詳細説明

背景開発プロセス中に Docker コンテナ化をサポートするために、通常は Maven を使用してコ...

スライドドアを実装するための CSS サンプルコード

いわゆるスライディングドアテクノロジーとは、さまざまな長さのテキストに合わせてボックスの背景を自動的...

MySQL が my.cnf を読み込む順序の詳細

目次MySQLがmy.cnfを読み込む順序1. mysql.server の起動方法2. mysql...

overflow:hidden の役割の詳細な説明 (オーバーフローの非表示、フロートのクリア、マージンの崩壊の解決)

1. オーバーフロー:非表示 オーバーフロー非表示要素に overflow:hidden が設定さ...

CentOS6 アップグレード glibc 操作手順

目次背景glibc 2.14をコンパイルするソフトリンクを変更するやっと背景テスト環境には Cent...

HTMLの最適化によりWebページの速度が向上

明らかな HTML、隠された「公開スクリプト」 Web ページのダウンロード時間を短縮する鍵は、フ...