合併 Compose 檔案

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 檔案中建模為序列,但它們具有特殊的唯一性要求

屬性唯一鍵
target
secretstarget
配置target
{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" 

如果未使用 !override,則根據上述合併規則,將暴露 8080:808443:443

其他資源

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