0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker-MySQL起動時にプロジェクト内に配置したDDLファイルを読み込ませる方法

Last updated at Posted at 2024-11-24

記事内容

DockerでMySQLを起動する際に、プロジェクト内に配置したDDLファイル(テーブル作成用SQLスクリプト)を読み込ませて自動でテーブルを作成する方法を以下に示します。

手順

1. DDLファイルの準備

プロジェクト内にDDLファイル(例: schema.sql)を作成します。このファイルには、必要なテーブル作成SQLを記述します。

例: schema.sql

CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    role VARCHAR(20) NOT NULL
);

CREATE TABLE IF NOT EXISTS timetables (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    day_of_week VARCHAR(10) NOT NULL,
    start_time TIME NOT NULL,
    end_time TIME NOT NULL,
    subject VARCHAR(100) NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

2. DDLファイルの配置

DDLファイルをプロジェクトディレクトリ内に配置し、Dockerコンテナにマウントするように設定します。

配置例:

project-root/
├── docker-compose.yml
├── sql/
│   └── schema.sql

3. docker-compose.ymlを修正

MySQLのvolumes設定を追加し、DDLファイルをコンテナ内の/docker-entrypoint-initdb.d/にマウントします。

修正後のdocker-compose.yml

version: '3.8'
services:
  mysql:
    image: mysql:8.0
    container_name: app-mysql
    environment:
      MYSQL_ROOT_PASSWORD: yourpassword
      MYSQL_DATABASE: app_db
    ports:
      - "3306:3306"
    volumes:
      # コンテナ内のディレクトリとボリュームを関連づける
      - mysql-data:/var/lib/mysql
      - ./sql/:/docker-entrypoint-initdb.d/
volumes:
  # ボリュームの名前
  mysql-data:

/var/lib/mysql:

MySQL サーバーがデータを保存するデフォルトのディレクトリ。データベースの実際の内容(テーブルやインデックスなど)はこの中に保存されます。これをボリュームと関連づけることで、コンテナを削除した場合でも、データベースの内容が失われず、また、再起動や新しい MySQL コンテナの立ち上げ時に、以前のデータを再利用できます

4. MySQLの初期化動作

MySQL公式Dockerイメージでは、コンテナ起動時に/docker-entrypoint-initdb.d/ディレクトリ内にあるすべての.sql.shスクリプトを自動的に実行します。これにより、DDLファイルが適用されます。

  1. Dockerコンテナの起動

    cd docker
    docker-compose up -d
    
  2. テーブル作成の確認
    コンテナ内でMySQLに接続し、テーブルが作成されていることを確認します。

    docker exec -it timetable-mysql mysql -u root -p
    

    MySQLプロンプトで以下を実行:

    USE timetable_db;
    SHOW TABLES;
    

注意点

1. 初回起動時のみ実行される

  • /docker-entrypoint-initdb.d/内のスクリプトは、MySQLデータベースが初期化される際(つまり、データボリュームが空の状態でコンテナを起動したとき)にのみ実行されます。
    再度SQLを流し直したい場合は、以下コマンドでデータボリュームを一旦空にしてから、コンテナを再起動してください。
    docker-compose down --volume
    docker-compose up --build
    

2. ファイル名の注意

  • .sqlファイルは順番に実行されるため、複数ファイルを使用する場合は名前に番号を付けるとよいです(例: 001_schema.sql, 002_data.sql)。

3. DDLファイルの更新

  • テーブル構造を更新したい場合は、コンテナを削除し、ボリュームをクリアした上で再度起動する必要があります。

以上

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?