651 字
3 分鐘

Docker Compose profiles 怎麼用:把本機除錯工具與正式服務分開啟動

本機開發常需要 Mailpit、Adminer、metrics exporter 或一次性的資料匯入工具;把它們全放進預設 docker compose up,會讓新成員每次都啟動不需要的容器。Docker Compose profiles 可把這些「可選服務」留在同一份設定檔,但只在明確啟用時加入 application model。

直接做法是:核心服務不設 profile,開發輔助服務才設 profile;每個 profile 都用 docker compose config 和實際啟動指令驗證依賴。 profiles 不是 production/development 覆寫檔的通用替代方案。

把核心服務維持在預設路徑#

services:
app:
build: .
ports: ['3000:3000']
mailpit:
image: axllent/mailpit
profiles: ['mail']
ports: ['8025:8025']
adminer:
image: adminer
profiles: ['db-ui']
ports: ['8080:8080']

不含 profilesapp 會一直在預設 application model 內。要開郵件測試工具時:

Terminal window
docker compose --profile mail up

也可用 COMPOSE_PROFILES=mail,db-ui 啟動多個集合。指定某一個帶 profile 的 service,例如 docker compose run adminer,Compose 會啟用該 service 的 profile;但不要把這當成它會自動展開所有可選相依服務。

最容易踩到的是跨 profile 依賴#

Compose 不會因為某 service 引用了 depends_onlinksextendsservice:... 形式的共用資源,就自動啟用被 profile 排除的 service。profile 組合讓引用的目標不存在時,Compose 會回報設定錯誤。

因此 app 若永遠需要 redis,兩者都不該拆進彼此不同、可任意關閉的 profile。反過來,只有 migration 時才需要的工具可以與核心 app 解耦,必要時用明確命令啟動。

Terminal window
# 看目前啟用 profile 後的完整設定,而不是只讀 YAML
docker compose --profile mail config
# 只檢查設定與 service 模型,不在背景留下容器
docker compose --profile mail config --services

profiles、include 與多份設定檔的分工#

profiles 適合「同一個 application 裡的可選 service」。若一組 service 有自己的 .env、路徑與維護責任,例如另一個團隊維護的監控 stack,使用 include 更清楚;可參考 Docker Compose include 拆檔的路徑與變數檢查

若設定差異是正式環境不同 image tag、secret 或資源限制,應用部署環境的明確設定檔或平台變數,不要靠開或關 profile 偷渡 production 行為。這樣才能從命令列清楚重現「這次到底啟動了什麼」。

上線前的最小驗證#

  1. 不帶 profile 執行 docker compose config --services,確認只有核心服務。
  2. 每一個 profile 個別執行 config,確認沒有缺少相依服務。
  3. 在 README 列出 profile 名稱、用途與需要的環境變數。
  4. CI 若需啟動測試依賴,明確傳入 --profile,不要依賴開發者本機環境變數。

參考資料:

Docker Docs:Compose profiles

Docker Docs:docker compose CLI

Docker Compose profiles 怎麼用:把本機除錯工具與正式服務分開啟動
https://laplusda.com/posts/docker-compose-profiles-local-tools/
作者
Zero
發佈於
2026-07-31
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。