合并
Compose 允许您通过多个 Compose 文件定义 Compose 应用程序模型。 执行此作时,Compose 会遵循某些规则来合并 Compose 文件。
这些规则概述如下。
映射
一个 YAMLmapping
通过添加缺失的条目并合并冲突的条目来合并。
合并以下示例 YAML 树:
services:
foo:
key1: value1
key2: value2
services:
foo:
key2: VALUE
key3: value3
生成与 YAML 树等效的 Compose 应用程序模型:
services:
foo:
key1: value1
key2: VALUE
key3: value3
序列
一个 YAMLsequence
通过将覆盖的 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 命令
合并使用 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:/work
services:
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 文件