第20章:オプションサービスを“必要なときだけ”起動する(profiles)🎛️🧩
この章は「普段は軽く、必要なときだけ便利ツールを足す」ための仕組み=profilesを覚える回だよ〜!😺✨ DB管理UIやRedis管理UIみたいな“補助輪ツール”を、いつも起動しないで済むようにして、開発スタックをスッキリ保つのがゴール👍
1) profilesって何?(超ざっくり)🧠💡
Composeでは、サービスに profiles を付けると「そのprofileが有効なときだけ、そのサービスを起動対象にする」ってできるよ〜🎚️✨
逆に、profiles を付けてないサービスは いつでも有効(常に起動対象) になるのが基本ルール!(Docker Documentation)
- ✅ いつも起動する:API / DB / Redis / Worker など(
profilesなし) - ✅ 必要なときだけ起動する:pgAdmin / Redis Insight / MailHog など(
profilesあり)
しかも大事ポイント👇
profilesは services にだけ効く(networks: や volumes: みたいなトップレベル要素は、profilesに関係なく“常に有効”)だよ!(Docker Documentation)
2) まずは最強にありがちな例:管理UIを“必要なときだけ”🛠️🧩
たとえばこんな気持ち👇
- ふだん:API/DB/Redisだけで軽く開発したい💨
- 必要なとき:DBの中身見たい→pgAdmin起動したい👀🐘
- Redisの中身見たい→RedisInsight起動したい👀🟥
そこで admin profile を作って、管理UIをまとめてオン/オフする!
3) compose.yaml 例(admin profile)📄✨
ここでは「pgAdmin と RedisInsight を
adminprofile に入れる」例だよ🎛️ ふだんは起動しないから、PCも気持ちも軽い😆🪶
services:
api:
build: ./api
ports:
- "3000:3000"
depends_on:
- db
- redis
db:
image: postgres:17
environment:
POSTGRES_PASSWORD: postgres
volumes:
- pgdata:/var/lib/postgresql/data
redis:
image: redis:7
# --- ここから「必要なときだけ」組 ---
pgadmin:
image: dpage/pgadmin4:8
profiles: ["admin"]
ports:
- "5050:80"
environment:
PGADMIN_DEFAULT_EMAIL: admin@example.com
PGADMIN_DEFAULT_PASSWORD: admin
depends_on:
- db
redisinsight:
image: redis/redisinsight:2
profiles: ["admin"]
ports:
- "5540:5540"
depends_on:
- redis
volumes:
pgdata:
ポイントはこれだけ👇😺
pgadminとredisinsightにprofiles: ["admin"]を付けた- それ以外(api/db/redis)は普段から必要だから profile を付けない
profilesの基本仕様はこの挙動でOK!(Docker Documentation)
4) 起動のしかた(3パターン)🚀🎚️
パターンA:普段どおり(adminなし)🏃♂️💨
docker compose up -d
→ api/db/redis だけ起動(軽い!)✨
パターンB:admin profile を有効化して起動🎛️✨
docker compose --profile admin up -d
→ api/db/redis に加えて、pgadmin/redisinsight も起動するよ!
--profile で有効化できるのが公式のやり方👍(Docker Documentation)
パターンC:環境変数でprofileを有効化(手元の切り替え用)🔁🧪
PowerShellだとこんな感じ👇
$env:COMPOSE_PROFILES="admin"
docker compose up -d
これも公式にある方法だよ〜!(matsuand.github.io)
5) 「サービス名を直接指定」するとどうなる?(地味に便利)🎯🧰
実は…
profiles が付いてても、コマンドでサービス名を明示的に指定すると、そのサービスは起動できる!😳✨
そして、そのとき profileが自動的に有効扱いになるよ。(Docker Documentation)
例:pgAdminだけ欲しい!ってとき👇
docker compose up -d pgadmin
このときの注意👇⚠️
- 起動するのは「指定したサービス +
depends_onの依存」だけ - 同じprofile仲間の他サービス(例:redisinsight)は勝手に起動しないことがある
→ “profile丸ごと起動”したいなら
--profile adminが安定!(Docker Documentation)
6) 罠ポイント:depends_on と profiles の相性⚠️🧨
ここ、初学者が一番ハマるやつ!!😵💫💥
ありがちな事故
「AサービスがBサービスに depends_on してるのに、Bがprofileで無効」だと、
**“必要なのに無効だよ”**ってエラーになることがあるよ。
(実際、そういう挙動の説明が公式側にもある)(docs.docker.jp)
回避の基本ルール(これだけ覚える)🧠✨
- 本体が依存するサービス(DB/Redis等)は profile に入れない(常時有効にする)
- profileに入れるのは、基本「なくても本体が動く補助ツール」だけ🎛️🧩
つまりこう👇
- ✅ DBは常時起動(profileなし)
- ✅ pgAdminはadmin profile(なくてもAPIは動く)
この設計にすると、ほぼ平和🕊️✨
7) “設計センス”としてのprofiles(超大事)🏗️✨
profilesは、ただの便利機能じゃなくて「構成を読みやすくする設計」でもあるよ😺
✅ こう分けると気持ちいい
- core(常時):API / DB / Redis / Worker
- admin(必要時):管理UI系(pgAdmin / RedisInsight)
- debug(必要時):デバッグ用のツールコンテナ(shell、HTTPクライアントなど)
- perf/obs(必要時):監視・トレース系(必要になってからでOK)📈
8) ミニ演習(手が覚えるやつ)✍️🔥
演習1:admin profile を作る🎛️
pgadminサービスを追加してprofiles: ["admin"]を付ける- ふつうに
docker compose up -d docker compose psで pgadminがいないことを確認👀✅docker compose --profile admin up -dで pgadminが出ることを確認👀✅
演習2:サービス名指定の挙動を確認🎯
docker compose downdocker compose up -d pgadmin- pgadminとdbだけが起動するか観察(depends_on込み)👀
redisinsightが起動しないことがあるのも観察(だから丸ごとは--profileがラク)😺(Docker Documentation)
演習3:profilesを複数にしてみる🎚️🎚️
adminとdebugの2つを作って、両方起動してみよう!
docker compose --profile admin --profile debug up -d
複数指定できるのも公式どおりだよ〜!(matsuand.github.io)
9) すぐ使えるチートシート🧾✨
-
普段:
docker compose up -d -
管理UIも起動:
docker compose --profile admin up -d -
状態確認:
docker compose ps -
ログ:
docker compose logs -f -
停止(データは残る):
docker compose down -
停止+ボリューム削除(DBデータ消える!)⚠️
docker compose down -v
10) AIで爆速にするコツ(でも最後は人間がチェック)🤖🧠
GitHub Copilot や OpenAI 系のAIに、こんな感じで投げると強いよ💪✨
- 「pgAdminとRedisInsightを
adminprofile に入れた compose.yaml の例を出して」 - 「普段はcoreだけ起動、必要なときだけadminを有効化、コマンド例も付けて」
- 「depends_on と profiles のハマりどころも注意書きして」
ただし、AIはたまにポート衝突やパスワード直書きを雑に出すから、そこだけは人間が最後に整えると安全😺🛡️
次の章(ホットリロードをCompose運用に組み込む🔥♻️)に行くと、 「普段は core + ホットリロード、必要なときだけ admin」みたいに、さらに開発が快適になるよ〜!🚀✨
(なお、profiles の基本挙動はCompose公式の how-to と file reference に沿ってるよ)(Docker Documentation)