包含

要求: Docker Compose 2.20.3 及更高版本

使用 include,你可以将一个单独的 compose.yaml 文件直接合并到当前的 compose.yaml 文件中。这使得将复杂应用程序模块化为子 Compose 文件变得容易,从而使应用程序配置更简单、更清晰。

include 顶级元素有助于直接在配置文件组织中反映负责代码的工程团队。它还解决了 extendsmerge 存在的相对路径问题。

include 部分中列出的每个路径都作为单独的 Compose 应用程序模型加载,拥有自己的项目目录,以便解析相对路径。

包含的 Compose 应用程序加载后,所有资源都会复制到当前的 Compose 应用程序模型中。

注意

include 会递归应用,因此一个包含自身 include 部分的 Compose 文件也会导致包含其他文件。

示例

include:
  - my-compose-include.yaml  #with serviceB declared
services:
  serviceA:
    build: .
    depends_on:
      - serviceB #use serviceB directly as if it was declared in this Compose file

my-compose-include.yaml 管理 serviceB,其中详细说明了一些副本、用于检查数据的 Web UI、隔离网络、用于数据持久化的数据卷等。依赖于 serviceB 的应用程序不需要了解基础设施细节,而是将该 Compose 文件作为一个可依赖的构建块来使用。

这意味着管理 serviceB 的团队可以重构其数据库组件以引入额外服务,而不会影响任何依赖团队。这也意味着依赖团队在运行每个 Compose 命令时不需要包含额外的标志。

Include 和覆盖

如果 include 中的任何资源与包含的 Compose 文件中的资源发生冲突,Compose 会报告错误。此规则可防止与包含的 compose 文件作者定义的资源发生意外冲突。但是,在某些情况下,你可能需要调整包含的模型。这可以通过向 include 指令添加覆盖文件来实现

include:
  - path : 
      - third-party/compose.yaml
      - override.yaml  # local override for third-party model

这种方法的主要限制是,你需要为每个 include 维护一个专用的覆盖文件。对于包含多个 includes 的复杂项目,这将导致大量的 Compose 文件。

另一种选择是使用 compose.override.yaml 文件。虽然在使用 include 的文件中声明相同资源时会拒绝冲突,但全局 Compose 覆盖文件可以覆盖合并后的模型,如下例所示

compose.yaml 文件

include:
  - team-1/compose.yaml # declare service-1
  - team-2/compose.yaml # declare service-2

覆盖 compose.override.yaml 文件

services:
  service-1:
    # override included service-1 to enable debugger port
    ports:
      - 2345:2345

  service-2:
    # override included service-2 to use local data folder containing test data
    volumes:
      - ./data:/data

结合使用时,这允许你受益于第三方可重用组件,并根据你的需要调整 Compose 模型。

参考信息

include 顶级元素

页面选项