合并

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 命令entrypointhealthcheck: 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

重置值

除了前面描述的机制之外,还可以使用 override Compose 文件从应用程序模型中删除元素。 为此,可以将自定义 YAML 标签设置为 覆盖被覆盖的 Compose 文件设置的值。必须提供 attribute 的有效值, 但将被忽略,并且 target 属性将使用 type 的默认值或 .!resetnull

为了提高可读性,建议将属性值显式设置为 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 中引入

虽然可用于使用覆盖文件从 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" 

如果未使用,则 和 将根据上述合并规则公开。!override8080:808443:443

其他资源

有关如何使用 merge 创建复合 Compose 文件的更多信息,请参阅使用多个 Compose 文件