擴充您的 Compose 檔案

Docker Compose 的 extends 屬性 可讓您在不同的檔案,甚至完全不同的專案之間共用通用設定。

如果您有多個服務重複使用一組通用設定選項,則擴充服務會很有用。 使用 extends,您可以在一個位置定義一組通用服務選項,並從任何地方參考它。 您可以參考另一個 Compose 檔案並選擇您也想在自己的應用程式中使用的服務,並能夠根據自己的需求覆寫某些屬性。

重要

當您使用多個 Compose 檔案時,您必須確保檔案中的所有路徑都是相對於基本 Compose 檔案(即主專案資料夾中的 Compose 檔案)。 這是必需的,因為擴充檔案不必是有效的 Compose 檔案。 擴充檔案可以包含小的設定片段。 追蹤服務的哪個片段相對於哪個路徑既困難又令人困惑,因此為了更容易理解路徑,所有路徑都必須相對於基本檔案定義。

運作方式

從另一個檔案擴充服務

以下列範例為例

services:
  web:
    extends:
      file: common-services.yml
      service: webapp

這會指示 Compose 僅重複使用 common-services.yml 檔案中定義的 webapp 服務的屬性。 webapp 服務本身不是最終專案的一部分。

如果 common-services.yml 如下所示

services:
  webapp:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - "/data"

您會得到與您在 web 下直接定義相同的 buildportsvolumes 設定值的 docker-compose.yml 完全相同的結果。

若要將服務 webapp 包含在最終專案中,當從另一個檔案擴充服務時,您需要在目前的 Compose 檔案中明確包含這兩個服務。 例如(請注意,這是一個非規範範例)

services:
  web:
    build: alpine
    command: echo
    extends:
      file: common-services.yml
      service: webapp
  webapp:
    extends:
      file: common-services.yml
      service: webapp

或者,您可以使用 include

在同一個檔案中擴充服務

如果您在同一個 Compose 檔案中定義服務,並從另一個服務擴充一個服務,則原始服務和擴充服務都將成為您最終設定的一部分。 例如

services:
  web:
    build: alpine
    extends: webapp
  webapp:
    environment:
      - DEBUG=1

在同一個檔案中以及從另一個檔案擴充服務

您可以更進一步,在 compose.yaml 中在本地定義或重新定義設定

services:
  web:
    extends:
      file: common-services.yml
      service: webapp
    environment:
      - DEBUG=1
    cpu_shares: 5

  important_web:
    extends: web
    cpu_shares: 10

其他範例

當您有多個具有通用設定的服務時,擴充個別服務會很有用。 以下範例是一個具有兩個服務的 Compose 應用程式,一個 Web 應用程式和一個佇列工作者。 這兩個服務都使用相同的程式碼庫,並共用許多設定選項。

common.yaml 檔案定義通用設定

services:
  app:
    build: .
    environment:
      CONFIG_FILE_PATH: /code/config
      API_KEY: xxxyyy
    cpu_shares: 5

docker-compose.yaml 定義使用通用設定的具體服務

services:
  webapp:
    extends:
      file: common.yaml
      service: app
    command: /code/run_web_app
    ports:
      - 8080:8080
    depends_on:
      - queue
      - db

  queue_worker:
    extends:
      file: common.yaml
      service: app
    command: /code/run_worker
    depends_on:
      - queue

例外狀況和限制

使用 `extends` 時,服務之間永遠不會共享 `volumes_from` 和 `depends_on`。這些例外情況的存在是為了避免隱式依賴關係;您必須在本地定義 `volumes_from`。這確保了在閱讀當前文件時,服務之間的依賴關係清晰可見。在本地定義這些內容還可以確保對被引用文件的更改不會破壞任何內容。

如果您只需要共享單個服務,並且熟悉您要擴展的文件,以便您可以調整配置,那麼 `extends` 非常有用。但是,當您想要重複使用其他人不熟悉的配置,並且不知道它自身的依賴關係時,這就不是一個可接受的解決方案。

相對路徑

當使用帶有 `file` 屬性的 `extends` 指向另一個文件夾時,被擴展服務聲明的相對路徑會被轉換,以便在擴展服務使用它們時仍然指向同一個文件。以下範例說明了這一點

基礎 Compose 檔案

services:
  webapp:
    image: example
    extends:
      file: ../commons/compose.yaml
      service: base

`commons/compose.yaml` 檔案

services:
  base:
    env_file: ./container.env

生成的服務會參照 `commons` 目錄中的原始 `container.env` 檔案。可以使用 `docker compose config` 來確認這一點,它會檢查實際的模型

services:
  webapp:
    image: example
    env_file: 
      - ../commons/container.env

參考資訊