在 Compose 中使用設定檔 (Profiles)
設定檔 (Profiles) 透過選擇性地啟動服務,協助您針對不同的環境或使用情境調整 Compose 應用程式。服務可以指派給一個或多個設定檔;未指派的服務預設會啟動/停止,而已指派的服務僅在對應設定檔啟用時才會啟動/停止。此機制允許您將特定服務(如偵錯或開發工具)包含在同一個 compose.yml 檔案中,並僅在需要時啟用它們。
為服務指派設定檔
服務透過 profiles 屬性與設定檔產生關聯,該屬性接受一組設定檔名稱陣列。
services:
frontend:
image: frontend
profiles: [frontend]
phpmyadmin:
image: phpmyadmin
depends_on: [db]
profiles: [debug]
backend:
image: backend
db:
image: mysql在此範例中,frontend 和 phpmyadmin 服務分別被指派到 frontend 和 debug 設定檔,因此僅在對應的設定檔啟用時才會啟動。
沒有 profiles 屬性的服務預設總是啟用。在此情況下,執行 docker compose up 僅會啟動 backend 和 db。
有效的設定檔名稱須符合 regex 格式 [a-zA-Z0-9][a-zA-Z0-9_.-]+。
提示應用程式的核心服務不應被指派
profiles,以確保它們始終保持啟用狀態並自動啟動。
啟動特定設定檔
若要啟動特定設定檔,請提供 --profile 命令列選項,或使用 COMPOSE_PROFILES 環境變數。
$ docker compose --profile debug up
$ COMPOSE_PROFILES=debug docker compose up
這兩個指令都會啟動已啟用 debug 設定檔的服務。在上述的 compose.yaml 檔案中,這會啟動 db、backend 和 phpmyadmin 服務。
啟動多個設定檔
您也可以啟用多個設定檔,例如執行 docker compose --profile frontend --profile debug up,此時 frontend 和 debug 設定檔都會被啟用。
透過傳遞多個 --profile 旗標,或為 COMPOSE_PROFILES 環境變數設定逗號分隔的列表,即可指定多個設定檔。
$ docker compose --profile frontend --profile debug up
$ COMPOSE_PROFILES=frontend,debug docker compose up
若要同時啟用所有設定檔,您可以執行 docker compose --profile "*"。
設定檔自動啟動與相依性解析
當您在命令列中明確指定一個已指派設定檔的服務時,您不需要手動啟用該設定檔,因為 Compose 會執行該服務,無論其設定檔是否已啟用。這對於執行一次性服務或偵錯工具非常有用。
僅有該指定的服務(以及透過 depends_on 宣告的任何相依服務)會被啟動。共享相同設定檔的其他服務將不會啟動,除非:
- 它們也被明確指定,或者
- 該設定檔已透過
--profile或COMPOSE_PROFILES明確啟用。
當具有指派 profiles 的服務在命令列中被明確指定時,其設定檔會自動啟動,因此您無需手動啟動它們。這可用於一次性服務和偵錯工具。以下面的設定為例:
services:
backend:
image: backend
db:
image: mysql
db-migrations:
image: backend
command: myapp migrate
depends_on:
- db
profiles:
- tools# Only start backend and db (no profiles involved)
$ docker compose up -d
# Run the db-migrations service without manually enabling the 'tools' profile
$ docker compose run db-migrations在此範例中,即使 db-migrations 被指派到 tools 設定檔,它仍會因為被明確指定而執行。db 服務也會自動啟動,因為它被列在 depends_on 中。
如果目標服務擁有也被限制在設定檔後的相依服務,您必須確保這些相依服務屬於下列其中一種狀態:
- 屬於同一個設定檔
- 另外獨立啟動
- 未指派任何設定檔,因此始終啟用
停止具有特定設定檔的應用程式與服務
與啟動特定設定檔時一樣,您可以使用 --profile 命令列選項,或使用 COMPOSE_PROFILES 環境變數。
$ docker compose --profile debug down
$ COMPOSE_PROFILES=debug docker compose down
這兩個指令都會停止並移除具有 debug 設定檔的服務以及沒有設定檔的服務。在接下來的 compose.yaml 檔案中,這會停止 db、backend 和 phpmyadmin 服務。
services:
frontend:
image: frontend
profiles: [frontend]
phpmyadmin:
image: phpmyadmin
depends_on: [db]
profiles: [debug]
backend:
image: backend
db:
image: mysql如果您只想停止 phpmyadmin 服務,您可以執行:
$ docker compose down phpmyadmin
或
$ docker compose stop phpmyadmin
注意執行
docker compose down僅會停止backend和db。