搭配 Compose 使用設定檔
設定檔可讓您透過選擇性地啟用服務,針對不同的環境或使用案例調整 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`。
有效的設定檔名稱遵循 `[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.yml` 檔案中,這會啟動服務 `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 "*" `。
自動啟動設定檔和相依性解析
當在命令列上明確指定具有指派 `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
$ docker compose up -d
# This runs db-migrations (and,if necessary, start db)
# by implicitly enabling the profiles `tools`
$ docker compose run db-migrations
但請記住,`docker compose` 只會自動啟動命令列上服務的設定檔,而不會啟動任何相依性的設定檔。
這表示目標服務 `depends_on` 的任何其他服務應該
- 共用一個共同的設定檔
- 始終啟動,方法是省略 `profiles` 或明確啟動相符的設定檔
services:
web:
image: web
mock-backend:
image: backend
profiles: ["dev"]
depends_on:
- db
db:
image: mysql
profiles: ["dev"]
phpmyadmin:
image: phpmyadmin
profiles: ["debug"]
depends_on:
- db
# Only start "web"
$ docker compose up -d
# Start mock-backend (and, if necessary, db)
# by implicitly enabling profiles `dev`
$ docker compose up -d mock-backend
# This fails because profiles "dev" is not enabled
$ docker compose up phpmyadmin
雖然指定 `phpmyadmin` 會自動啟動設定檔 `debug`,但它不會自動啟動 `db` 所需的設定檔,即 `dev`。
要解決此問題,您必須將 debug
設定檔新增到 db
服務
db:
image: mysql
profiles: ["debug", "dev"]
或明確啟動 dev
設定檔
# Profiles "debug" is started automatically by targeting phpmyadmin
$ docker compose --profile dev up phpmyadmin
$ COMPOSE_PROFILES=dev docker compose up phpmyadmin
停止特定設定檔
如同啟動特定設定檔,您可以使用 --profile
命令列選項 或使用 COMPOSE_PROFILES
環境變數
$ docker compose --profile debug down
$ COMPOSE_PROFILES=debug docker compose down
這兩個指令都會停止並移除具有 debug
設定檔的服務。在以下 compose.yml
檔案中,這會停止 db
和 phpmyadmin
服務。
services:
frontend:
image: frontend
profiles: [frontend]
phpmyadmin:
image: phpmyadmin
depends_on: [db]
profiles: [debug]
backend:
image: backend
db:
image: mysql
注意事項
執行
docker compose down
只會停止backend
和db
。