DockerのOfficial RepositoriesのMySQLを使って、初回のDBデータ作成時に、カスタムSQLを実行する。
MySQLイメージは起動時にMySQLデータディレクトリ(/var/lib/mysql)の中身がない場合、mysql_install_dbなどが実行されます。その処理の中で、 /docker-entrypoint-initdb.dディレクトリにシェルスクリプトや、SQLが存在する場合、それを実行してくれる仕組みがあります。
サンプル
サンプルとして、Docker Composeを使って、PHPMyAdminとMySQLサーバを構築してみます。
その際、初回起動時に2つのデータベースと1つのテーブルを作成します。
うち1つは環境変数MYSQL_DATABASEをセットすることによって自動的に作成されるデータベース、それ以外がdocker-entrypoint-initdb.dによるものです。
web: | |
image: corbinu/docker-phpmyadmin | |
ports: | |
- "80:80" | |
links: | |
- mysql:mysql | |
environment: | |
MYSQL_USERNAME: root | |
mysql: | |
image: mysql | |
volumes: | |
- ./initdb.d:/docker-entrypoint-initdb.d | |
environment: | |
MYSQL_ROOT_PASSWORD: mysqlpassword | |
MYSQL_USER: "example_user" | |
MYSQL_PASSWORD: "example_pass" | |
MYSQL_DATABASE: "example" | |
ports: | |
- "3306:3306" |
#!/bin/bash -eu | |
mysql=( mysql --protocol=socket -uroot -p"${MYSQL_ROOT_PASSWORD}" ) | |
"${mysql[@]}" <<-EOSQL | |
CREATE DATABASE IF NOT EXISTS another_db; | |
GRANT ALL ON another_db.* TO '${MYSQL_USER}'@'%' ; | |
EOSQL |
CREATE TABLE IF NOT EXISTS `example`.`sample` ( | |
`id` INT UNSIGNED NOT NULL, | |
`name` VARCHAR(255) NOT NULL, | |
`created_at` DATETIME NOT NULL, | |
PRIMARY KEY (`id`)) | |
ENGINE = InnoDB; |
ローカルにinitdb.dフォルダを作成し、それをMySQLイメージ中のdocker-entrypoint-initdb.dにマウントさせます。
initdb.dフォルダには、create_another_db.shとcreate_table_in_exampledb.sqlを置いておきます。
docker-compose upでMySQLが立ち上がると、最後にそれらのファイルが実行されます。
create_another_db.shはDBを新規作成します。シェルなので、環境変数を参照できます。
MySQLへの流し込み方法は、docker-entrypoint.shを参考にパスワードを追記した形です。
create_table_in_exampledb.sqlは環境変数MYSQL_DATABASEによって既に作成されているDBに対してテーブルを作成します。
全部入りはこちら→mistymagich/docker-mysql-sample
“DockerのOfficial imageのMySQLを使って初回起動時にカスタムSQLを実行させる” への1件のフィードバック