LoginSignup
24
33

More than 3 years have passed since last update.

【Docker】MySQLで複数database環境を構築する

Last updated at Posted at 2020-04-23

環境

  • Docker
  • MySQL 5.7

背景

Docker で MySQL を起動する時に、引数で database 名を指定できますが、1つしか指定できないという制限があります(docker run または docker-compose いずれを使った場合でも)。

複数databaseを構築する方法

https://hub.docker.com/_/mysqlInitializing 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 rundocker-composeに共通で必要なファイル

.sql というファイル名であれば何でもいいのですが、以下のようなファイルを用意します。
この中で、「database の作成」と「権限付与」を行います。
ここでではディレクトリ名を仮にsome_dirとしています。

some_dir/init.sql
CREATE DATABASE IF NOT EXISTS `second_db_comes_here`;
GRANT ALL ON second_db_comes_here.* TO 'mysql_user_comes_here'@'%';

second_db_comes_heremysql_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 を使う場合

version: '3.7'

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

上記の内容が、英語で説明されています。

リンク

24
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
33