記事内容
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ファイルが適用されます。
-
Dockerコンテナの起動
cd docker docker-compose up -d
-
テーブル作成の確認
コンテナ内で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ファイルの更新
- テーブル構造を更新したい場合は、コンテナを削除し、ボリュームをクリアした上で再度起動する必要があります。
以上