合併
以下概述了這些規則。
對映
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 命令
當合並使用服務屬性 command、entrypoint 和 healthcheck: test
的 Compose 檔案時,該值將被最新 Compose 檔案覆蓋,而不是追加。
合併以下示例 YAML 樹
services:
foo:
command: ["echo", "foo"]
services:
foo:
command: ["echo", "bar"]
生成與 YAML 樹等效的 Compose 應用程式模型
services:
foo:
command: ["echo", "bar"]
唯一資源
適用於ports、volumes、secrets 和 configs 服務屬性。雖然這些型別在 Compose 檔案中被建模為一個序列,但它們具有特殊的唯一性要求。
屬性 | 唯一鍵 |
---|---|
volumes | target |
secrets | source |
configs | source |
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
替換值
雖然 !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:80
和 8443:443
將根據上面概述的合併規則被公開。
其他資源
有關如何使用合併建立複合 Compose 檔案的更多資訊,請參閱使用多個 Compose 檔案