合并

Compose 允许您通过多个 Compose 文件定义 Compose 应用程序模型 。执行此操作时,Compose 会遵循本节中声明的规则来合并 Compose 文件。

测绘

mapping通过添加缺失的条目并合并冲突的条目来合并YAML 。

合并以下示例 YAML 树:

services:
  foo:
    key1: value1
    key2: value2
services:
  foo:
    key2: VALUE
    key3: value3

生成相当于 YAML 树的 Compose 应用程序模型:

services:
  foo:
    key1: value1
    key2: VALUE
    key3: value3

顺序

sequence通过将覆盖 Compose 文件中的值附加到前一个文件来合并YAML 。

合并以下示例 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

例外情况

外壳命令

合并使用服务属性 commandentrypointhealthcheck:test的 Compose 文件时,该值将被最新的 Compose 文件覆盖,并且不会附加。

合并以下示例 YAML 树:

services:
  foo:
    command: ["echo", "foo"]
services:
  foo:
    command: ["echo", "bar"]

生成相当于 YAML 树的 Compose 应用程序模型:

services:
  foo:
    command: ["echo", "bar"]

独特的资源

适用于 portsvolumessecretsconfigs服务属性。虽然这些类型在 Compose 文件中建模为序列,但它们具有特殊的唯一性要求:

属性独特的钥匙
目标
秘密来源
配置来源
港口{ip、目标、已发布、协议}

合并 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

替换值

Docker Compose 版本 2.24.4中引入

虽然!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 文件