合并
Compose 允许您通过多个 Compose 文件定义 Compose 应用程序模型 。执行此操作时,Compose 会遵循本节中声明的规则来合并 Compose 文件。
测绘
mapping
通过添加缺失的条目并合并冲突的条目来合并YAML 。
合并以下示例 YAML 树:
services:
foo:
key1: value1
key2: value2
services:
foo:
key2: VALUE
key3: value3
生成相当于 YAML 树的 Compose 应用程序模型:
services:
foo:
key1: value1
key2: VALUE
key3: value3
顺序
sequence
通过将覆盖 Compose 文件中的值附加到前一个文件来合并YAML 。
合并以下示例 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
例外情况
外壳命令
合并使用服务属性
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 文件中建模为序列,但它们具有特殊的唯一性要求:
属性 | 独特的钥匙 |
---|---|
卷 | 目标 |
秘密 | 来源 |
配置 | 来源 |
港口 | {ip、目标、已发布、协议} |
合并 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 文件