環境
- Docker
- MySQL 5.7
背景
Docker で MySQL を起動する時に、引数で database 名を指定できますが、1つしか指定できない
という制限があります(docker run
または docker-compose
いずれを使った場合でも)。
複数databaseを構築する方法
https://hub.docker.com/_/mysql の Initializing a fresh instance
の項目に、以下の通り書かれています(抜粋)。
/docker-entrypoint-initdb.d
にある拡張子.sh、.sql、.sql.gzのファイルを実行します
。ファイルはアルファベット順に実行されます。
SQLダンプをそのディレクトリにマウントすることでmysqlサービスを簡単に作成し、提供されたデータを含むカスタムイメージを提供できます。
SQLファイルは、デフォルトでMYSQL_DATABASE変数で指定されたデータベースにインポートされます。
つまり、ローカルで SQLファイルを作成し、そのディレクトリを /docker-entrypoint-initdb.d
にマウントすると、そのファイルが実行されます。
最後の文章(「SQLファイルは、デフォルトでMYSQL_DATABASE変数で指定されたデータベースにインポートされます」)が気になりましたが(MYSQL_DATABASE変数で指定されたデータベースが作成され、その中で新たなデータベースを作成することが出来るのか?)、問題なく作成できました。
docker run
とdocker-compose
に共通で必要なファイル
.sql
というファイル名であれば何でもいいのですが、以下のようなファイルを用意します。
この中で、「database の作成」と「権限付与」を行います。
ここでではディレクトリ名を仮にsome_dir
としています。
CREATE DATABASE IF NOT EXISTS `second_db_comes_here`;
GRANT ALL ON second_db_comes_here.* TO 'mysql_user_comes_here'@'%';
second_db_comes_here
と mysql_user_comes_here
を環境に応じて変更してください。
docker run を使う場合
# 以下のコマンド自体を、どこかのファイルに記述していると仮定してください。
CURRENT_DIR=$(cd $(dirname $0); pwd) # このファイルの full path が得られる。
docker run --name $CONTAINER_NAME \
-d \
-p $DB_PORT:3306 \
-e MYSQL_DATABASE=$DB_NAME \
-e MYSQL_USER=$DB_USER \
-e MYSQL_PASSWORD=$DB_PASS \
-e MYSQL_ROOT_PASSWORD=$DB_ROOT_PASS \
-v ${CURRENT_DIR}/some_dir:/docker-entrypoint-initdb.d \ # この行を追加する
mysql:5.7
docker-compose を使う場合
services:
database:
image: mysql:5.7
env_file: .env
environment:
MYSQL_USER: 'mysql_user_comes_here'
MYSQL_PASSWORD: 'mysql_password_comes_here'
MYSQL_DATABASE: 'mysql_db_comes_here'
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
ports:
- 3307:3306
volumes:
- ./some_dir:/docker-entrypoint-initdb.d # この行を追加する。./some_dir 部分は、docker-compose.yml からの相対パス。
確認
MySQL にログインして、database ができていることを確認します。
$ docker exec -it <docker_container_name> /bin/bash
docker$ mysql -u root -p
mysql> show databases;
mysql> use <first_database>;
mysql> show tables;
mysql> use <second_database>;
mysql> show tables;
参考URL
上記の内容が、英語で説明されています。
- https://forums.docker.com/t/multiple-databases-in-official-mysql-container/8324/2
- https://github.com/abagayev/docker-bootstrap-collection/tree/master/mysql-few-databases