包括

在 Docker Compose 版本 2.20.3 中引入

使用 ,可以直接在当前文件中合并单独的文件。这样,可以轻松地将复杂的应用程序模块化为子 Compose 文件,从而使应用程序配置变得更简单、更明确。includecompose.yamlcompose.yaml

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

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

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

注意

include递归应用,因此声明其自身部分的包含的 Compose 文件也会导致其他文件也被包含进来。include

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管理哪些副本的详细信息、用于检查数据的 Web UI、隔离的网络、用于数据持久性的卷等。依赖的应用程序不需要了解基础设施详细信息,并将 Compose 文件用作它可以依赖的构建块。serviceBserviceB

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

包含和覆盖

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

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

此方法的主要限制是您需要为每个 include 维护一个专用的覆盖文件。对于具有多个 包含此函数将导致生成许多 Compose 文件。

另一种选择是使用文件。While 冲突将从文件中被拒绝 when same 资源,则全局 Compose 覆盖文件可以覆盖生成的合并模型,如以下示例所示:compose.override.yamlinclude

主文件: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 模型。

参考资料

包括顶级元素