包含

Introduced in Docker Compose version 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中的任何资源与包含的Compose文件中的资源发生冲突,Compose会报告错误。此规则防止与包含的compose文件作者定义的资源发生意外冲突。然而,在某些情况下,您可能希望调整包含的模型。这可以通过在include指令中添加一个覆盖文件来实现:

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

这种方法的主要限制是,您需要为每个包含维护一个专用的覆盖文件。对于具有多个包含的复杂项目,这将导致许多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 顶级元素