Docker環境のmysql初期立ち上げ時に、実行するSQLの設定

基本的なmysqlの環境構築については、下記を参照。

テンプレート

初期稼働時のSQLを実行するためには、エンドポイントを指定する必要があるらしい。

エンドポイントの名称は docker-entrypoint-initdb.d

下記は、それを含んだテンプレートになる。

version: '3'

services:
  # MySQL
  db:
    image: mysql:5.7
    container_name: mysql_base
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    volumes:
    - ./data:/var/lib/mysql
    - ./log:/var/log
    - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./init_dir:/docker-entrypoint-initdb.d
    ports:
    - 3306:3306
    networks:
      - external.group
networks:
  external.group:
    external: true

指定しているディレクトリに n.sql を設置し、起動することで初期起動時に実行される。

CREATE DATABASE IF NOT EXISTS `mysql_base`;
grant all privileges on `test_`test_database`.* to 'docker'@'%';
DROP DATABASE IF EXISTS `mysql_base`;

用途

実際の場面で使用するのは、新しく環境を作成する際に、初期データが必要な時に、用意しておくと、あとから手で入力する手間が省ける。

このケースでは、DjangoのTestCaseを実行する際に、テスト用のデータベースに権限を作成しなければならず、無理やりだが、テスト用のデータベースを作成後、権限を付与、その後に削除するという苦肉の策をとっている。

参考

https://qiita.com/NagaokaKenichi/items/ae037963b33a85df33f5