合并 Compose 文件
Compose 允许你通过多个 Compose 文件定义 Compose 应用程序模型。在此过程中,Compose 遵循某些规则来合并 Compose 文件。
这些规则概述如下。
映射
通过添加缺失条目和合并冲突条目来合并 YAML mapping。
合并以下 YAML 树示例
services:
foo:
key1: value1
key2: value2services:
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.1services:
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:/workservices:
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 文件