合并
Compose 允许您通过多个 Compose 文件定义 Compose 应用程序模型。 执行此作时,Compose 会遵循某些规则来合并 Compose 文件。
这些规则概述如下。
映射
一个 YAMLmapping通过添加缺失的条目并合并冲突的条目来合并。
合并以下示例 YAML 树:
services:
foo:
key1: value1
key2: value2services:
foo:
key2: VALUE
key3: value3生成与 YAML 树等效的 Compose 应用程序模型:
services:
foo:
key1: value1
key2: VALUE
key3: value3序列
一个 YAMLsequence通过将覆盖的 Compose 文件中的值附加到前一个文件来合并。
合并以下示例 YAML 树:
services:
foo:
DNS:
- 1.1.1.1services:
foo:
DNS:
- 8.8.8.8生成与 YAML 树等效的 Compose 应用程序模型:
services:
foo:
DNS:
- 1.1.1.1
- 8.8.8.8异常
Shell 命令
合并使用 services attributes 命令的 Compose 文件时,entrypoint 和健康检查:test,该值将被最新的 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:/workservices:
foo:
volumes:
- bar:/work生成与 YAML 树等效的 Compose 应用程序模型:
services:
foo:
volumes:
- bar:/work重置值
除了前面描述的机制之外,还可以使用 override Compose 文件从应用程序模型中删除元素。
为此,自定义 YAML 标签 !reset可以设置为
覆盖被覆盖的 Compose 文件设置的值。必须提供 attribute 的有效值,
但将被忽略,并且 target 属性将设置为 type 的默认值或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允许您
以完全替换属性,绕过标准 Merge Rules。一个典型的示例是完全替换资源定义,以依赖不同的模型但使用相同的名称。
一个基础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将按照上述合并规则进行公开。
其他资源
有关如何使用 merge 创建复合 Compose 文件的更多信息,请参阅使用多个 Compose 文件