合併

Compose 允許您透過多個 Compose 檔案定義 Compose 應用程式模型。這樣做時,Compose 會遵循特定規則來合併 Compose 檔案。

以下概述了這些規則。

對映

YAML mapping 透過新增缺少的條目併合並衝突的條目進行合併。

合併以下示例 YAML 樹

services:
  foo:
    key1: value1
    key2: value2
services:
  foo:
    key2: VALUE
    key3: value3

生成與 YAML 樹等效的 Compose 應用程式模型

services:
  foo:
    key1: value1
    key2: VALUE
    key3: value3

序列

YAML sequence 透過將覆蓋 Compose 檔案中的值追加到前一個檔案進行合併。

合併以下示例 YAML 樹

services:
  foo:
    DNS:
      - 1.1.1.1
services:
  foo:
    DNS: 
      - 8.8.8.8

生成與 YAML 樹等效的 Compose 應用程式模型

services:
  foo:
    DNS:
      - 1.1.1.1
      - 8.8.8.8

異常

Shell 命令

當合並使用服務屬性 commandentrypointhealthcheck: test 的 Compose 檔案時,該值將被最新 Compose 檔案覆蓋,而不是追加。

合併以下示例 YAML 樹

services:
  foo:
    command: ["echo", "foo"]
services:
  foo:
    command: ["echo", "bar"]

生成與 YAML 樹等效的 Compose 應用程式模型

services:
  foo:
    command: ["echo", "bar"]

唯一資源

適用於portsvolumessecretsconfigs 服務屬性。雖然這些型別在 Compose 檔案中被建模為一個序列,但它們具有特殊的唯一性要求。

屬性唯一鍵
volumestarget
secretssource
configssource
ports{ip, target, published, protocol}

合併 Compose 檔案時,Compose 會追加不違反唯一性約束的新條目,併合並共享唯一鍵的條目。

合併以下示例 YAML 樹

services:
  foo:
    volumes:
      - foo:/work
services:
  foo:
    volumes:
      - bar:/work

生成與 YAML 樹等效的 Compose 應用程式模型

services:
  foo:
    volumes:
      - bar:/work

重置值

除了上述機制之外,覆蓋 Compose 檔案還可以用於從應用程式模型中刪除元素。為此,可以使用自定義的 YAML 標籤 !reset 可以設定為覆蓋覆蓋 Compose 檔案設定的值。屬性必須提供有效的值,但會被忽略,目標屬性將被設定為型別的預設值或 null

為了可讀性,建議顯式將屬性值設定為 null(null)或空陣列 [](使用 !reset null!reset []),以便清楚地表明結果屬性將被清除。

基本 compose.yaml 檔案

services:
  app:
    image: myapp
    ports:
      - "8080:80" 
    environment:
      FOO: BAR           

以及 compose.override.yaml 檔案

services:
  app:
    image: myapp
    ports: !reset []
    environment:
      FOO: !reset null

結果為

services:
  app:
    image: myapp

替換值

在 Docker Compose 版本 2.24.4 中引入

雖然 !reset 可以用於使用覆蓋檔案從 Compose 檔案中刪除宣告,但 !override 允許你完全替換屬性,繞過標準合併規則。一個典型的例子是完全替換資源定義,以便依賴於不同的模型,但使用相同的名稱。

基本 compose.yaml 檔案

services:
  app:
    image: myapp
    ports:
      - "8080:80"            

要刪除原始埠,但公開一個新的埠,可以使用以下覆蓋檔案

services:
  app:
    ports: !override
      - "8443:443" 

這將導致

services:
  app:
    image: myapp
    ports:
      - "8443:443" 

如果沒有使用 !override8080:808443:443 將根據上面概述的合併規則被公開。

其他資源

有關如何使用合併建立複合 Compose 檔案的更多資訊,請參閱使用多個 Compose 檔案