合并
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
序列
通过将覆盖 Compose 文件中的值附加到前一个文件来合并 YAML。sequence
合并以下示例 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 命令、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
重置值
除了前面描述的机制之外,还可以使用 override Compose 文件从应用程序模型中删除元素。
为此,可以将自定义 YAML 标签设置为
覆盖被覆盖的 Compose 文件设置的值。必须提供 attribute 的有效值,
但将被忽略,并且 target 属性将使用 type 的默认值或 .!reset
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
替换值
虽然可用于使用覆盖文件从 Compose 文件中删除声明,但允许您
以完全替换属性,绕过标准 Merge Rules。一个典型的示例是完全替换资源定义,以依赖不同的模型但使用相同的名称。!reset
!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
其他资源
有关如何使用 merge 创建复合 Compose 文件的更多信息,请参阅使用多个 Compose 文件