合併 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 命令
合併使用服務屬性 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 檔案中建模為序列,但它們具有特殊的唯一性要求
屬性 | 唯一鍵 |
---|---|
卷 | target |
secrets | target |
配置 | 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
替換值
雖然 !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 檔案