合并
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
序列
YAML `sequence` 通过将覆盖 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 属性 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 文件中建模为序列,但它们具有特殊的唯一性要求
属性 | 唯一键 |
---|---|
volumes | target |
secrets | target |
configs | target |
ports | {ip, target, published, protocol} |
合并 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 文件