ダッシュで奪取

ゲーム、読書、人生

【Docker】MySQLコンテナのデータベースに初期データを入れたかった

やりたいこと

  • ローカルで立ち上げたMySQLコンテナ内のデータベースに、初期データを作りたい

前提

  • 公式イメージ(mysql:8.1.0)を使用
  • Docker Compose使用

やったこと

  • /docker-entrypoint-initdb.d/ 内の .sql ファイルはコンテナ初回立ち上げ時に実行されるので、ここにCREATE TABLEやINSERT INTOする .sql ファイルを入れておく
compose.yaml
  • 自分の場合は ./mysql/ddl 配下に .sql ファイルを入れたので、./mysql/ddl/docker-entrypoint-initdb.d/ をマウントした
  • ファイルは実行してほしい順の連番で作る
    • アルファベット順ぽいけど、数字の連番なら確実なのでそうする
    • 01_create_database.sql, 02_create_table.sql, 03_insert_data.sql ...
  • 環境変数 MYSQL_DATABASEを指定していればその名前のデータベースが自動で作成されるので、CREATE DATABASEは別になくてもよい
    • CREATE文は CREATE DATABASE IF NOT EXISTS にしておかないと、環境変数に指定したもの + .sql ファイルのもので二重にデータベース作成しようとして怒られるので注意
version: '3.8'
services:
  mysql:
    build: ./mysql/
    tty: true
    restart: always
    ports:
      - "${MYSQL_PORT}:${MYSQL_PORT}"
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./mysql/ddl/:/docker-entrypoint-initdb.d/
      - mysql-data:/var/lib/mysql
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_HOST: ${MYSQL_HOST}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_PORT: ${MYSQL_PORT}
      TZ: ${TZ}
volumes:
  mysql-data:

実際のファイルたちは↓にあります github.com

メモ

  • テーブルや投入データに変更があった場合は手動で実行する or イメージ消す or volume削除する……の対処が必要
    • イメージやvolumeを削除した場合データもまるごと消えるので、ちゃんとした開発で使うときはマイグレーションの仕組みを作った方がよさそう(今回は立ち上げたかっただけなのでやらない)

参考URL