搭配 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 檔案中,這會停止 dbphpmyadmin 服務。

services:
  frontend:
    image: frontend
    profiles: [frontend]

  phpmyadmin:
    image: phpmyadmin
    depends_on: [db]
    profiles: [debug]

  backend:
    image: backend

  db:
    image: mysql

注意事項

執行 docker compose down 只會停止 backenddb

參考資訊

設定檔