Docker 公式イメージを利用すると、MySQL と PostgreSQL どちらも 環境変数を指定するだけでユーザー・パスワード・データベースの自動作成が可能 です。しかし、挙動には違いがある ため、それぞれの仕様を理解しておくことが重要です。
1. MySQL の初期設定
環境変数を指定するだけで自動作成
MySQL の Docker イメージ (mysql:<version>
) では、以下の環境変数を指定するだけで ユーザー・データベースが自動作成 されます。
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydatabase
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
volumes:
- mysql-data:/var/lib/mysql
MySQL の挙動
設定変数 | 説明 |
---|---|
MYSQL_ROOT_PASSWORD | root ユーザーのパスワードを設定 |
MYSQL_DATABASE | 指定したデータベースを自動作成 |
MYSQL_USER | 通常ユーザーを作成 (root とは別) |
MYSQL_PASSWORD | MYSQL_USER のパスワードを設定 |
✅ MYSQL_DATABASE
を指定すると root
によって自動作成される
✅ MYSQL_USER
と MYSQL_PASSWORD
を指定すると追加の通常ユーザーが作成される
✅ root
ユーザーは常に存在し、MYSQL_ROOT_PASSWORD
が必須
2. PostgreSQL の初期設定
MySQLと同じように環境変数で自動作成が可能
PostgreSQL の Docker イメージ (postgres:<version>
) も、以下の環境変数を指定することで ユーザー・データベースが自動作成 されます。
services:
postgresql:
image: postgres:17-alpine
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydatabase
volumes:
- postgres-data:/var/lib/postgresql/data
PostgreSQL の挙動
設定変数 | 説明 |
---|---|
POSTGRES_USER | スーパーユーザーとして作成される(root の代わり) |
POSTGRES_PASSWORD | POSTGRES_USER のパスワード |
POSTGRES_DB | 指定したデータベースを POSTGRES_USER の所有で作成 |
✅ MySQLの root
に相当するのは postgres
ユーザー
✅ POSTGRES_USER
を指定すると、管理者が postgres
ではなくなる(後述)
✅ 追加ユーザーは initdb.d
に SQL を用意しないと作成されない
3. MySQL と PostgreSQL の違い
項目 | MySQL | PostgreSQL |
---|---|---|
管理ユーザー | root (固定) | postgres (変更可能) |
初期パスワード変数 | MYSQL_ROOT_PASSWORD | POSTGRES_PASSWORD |
データベースの自動作成 | MYSQL_DATABASE | POSTGRES_DB |
通常ユーザーの自動作成 | MYSQL_USER + MYSQL_PASSWORD | POSTGRES_USER + POSTGRES_PASSWORD |
追加ユーザーの作成 | 環境変数で可能 | initdb.d に SQL を置く必要あり |
4. PostgreSQL の POSTGRES_USER
の注意点
POSTGRES_USER
を postgres
にするかどうか
MySQL と違い、POSTGRES_USER
を変更すると管理者 (postgres
) が POSTGRES_USER
に置き換わる 仕様があります。
例:POSTGRES_USER=myuser
にした場合
postgres
ユーザーが作成されず、myuser
がスーパーユーザーになる- 既存のスクリプトが
postgres
ユーザーを前提にしていると動かなくなる可能性がある
🚀 管理者を postgres
にしたいなら、POSTGRES_USER=postgres
にするのが無難!
5. PostgreSQL で追加ユーザーを作成する方法
PostgreSQL では POSTGRES_USER
以外の追加ユーザーを作る場合、initdb.d
に SQL スクリプトを用意します。
./docker/postgresql/initdb.d/init.sql
CREATE USER appuser WITH PASSWORD 'apppassword';
CREATE DATABASE appdb;
GRANT ALL PRIVILEGES ON DATABASE appdb TO appuser;
これを docker-compose.yml
でマウントすると、コンテナ起動時に自動実行 されます。
6. まとめ
✅ MySQL と PostgreSQL はどちらも環境変数で「ユーザー・パスワード・DBの自動作成」が可能
✅ PostgreSQL の POSTGRES_USER
は root
のようなものだが、変更すると管理者が変わるので注意
✅ 追加のユーザーやデータベースは initdb.d/init.sql
を使えば自動作成できる
✅ 管理者を postgres
のままにしたいなら POSTGRES_USER=postgres
にする!
💡 MySQL と PostgreSQL の初期設定の違いを理解して、適切にコンテナをセットアップしよう! 🚀