延伸您的 Compose 檔案

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

如果您有數個服務需要重複使用一組共同的設定選項,延伸服務將會非常實用。透過 extends,您可以在一個地方定義一組通用的服務選項,並在任何地方參考它。您可以參考另一個 Compose 檔案並選擇想要在應用程式中使用的服務,同時還可以根據需求覆寫部分屬性。

重要

當您使用多個 Compose 檔案時,必須確保檔案中的所有路徑都是相對於基礎 Compose 檔案(即主專案資料夾中的 Compose 檔案)的路徑。這是必要的,因為延伸檔案不一定是完整的 Compose 檔案。延伸檔案可以僅包含設定的小片段。追蹤服務的哪個片段對應到哪個路徑非常困難且容易混淆,因此為了讓路徑更容易理解,所有路徑都必須定義為相對於基礎檔案。

extends 屬性的運作方式

從其他檔案延伸服務

請參考以下範例

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 設定值的 compose.yaml 完全相同的結果。

若要在從其他檔案延伸服務時將 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 應用程式:一個網頁應用程式和一個佇列工作者 (queue worker)。這兩個服務使用相同的程式碼庫並共用許多設定選項。

common.yaml 檔案定義了通用設定

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

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 與指向另一個資料夾的 file 屬性一起使用時,被延伸服務所宣告的相對路徑會被轉換,以便在被延伸服務使用時,仍然指向同一個檔案。以下範例說明了這一點

基礎 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

參考資訊

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.