包含

在 Docker Compose 版本 2.20.0 中引入

Compose 应用程序可以声明对另一个 Compose 应用程序的依赖关系。这在以下情况下很有用:

  • 您想重用其他 Compose 文件。
  • 您需要将应用程序模型的各个部分分解成单独的 Compose 文件,以便可以单独管理或与他人共享。
  • 团队需要为其在更大部署中的子域声明的有限资源数量,保持 Compose 文件的合理复杂性。

include 顶级部分用于定义对另一个 Compose 应用程序或子域的依赖关系。include 部分中列出的每个路径都将加载为单独的 Compose 应用程序模型,具有其自己的项目目录,以便解析相对路径。

加载包含的 Compose 应用程序后,所有资源定义都将复制到当前 Compose 应用程序模型中。如果资源名称冲突,Compose 会显示警告,但不会尝试合并它们。为了强制执行此操作,include 在解析和合并用于定义 Compose 应用程序模型的 Compose 文件后进行评估,以便检测 Compose 文件之间的冲突。

include 递归应用,因此包含的 Compose 文件声明其自己的 include 部分会触发其他文件也被包含。

包含的 Compose 文件中包含的任何卷、网络或其他资源都可以在当前 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

Compose 还支持在 include 中使用插值变量。建议您指定强制变量。例如

include:
  -${INCLUDE_PATH:?FOO}/compose.yaml

简短语法

简短语法仅定义其他 Compose 文件的路径。该文件将使用父文件夹作为项目目录加载,并使用可选的 .env 文件进行加载,以通过插值定义任何变量的默认值。本地项目的环境可以覆盖这些值。

include:
  - ../commons/compose.yaml
  - ../another_domain/compose.yaml

services:
  webapp:
    depends_on:
      - included-service # defined by another_domain

在上面的示例中,../commons/compose.yaml../another_domain/compose.yaml 都会作为独立的 Compose 项目加载。include 引用的 Compose 文件中的相对路径相对于它们自己的 Compose 文件路径解析,而不是基于本地项目的目录。变量使用同一个文件夹中可选的 .env 文件中设置的值进行插值,并被本地项目的环境覆盖。

长语法

长语法提供了对子项目解析的更多控制

include:
   - path: ../commons/compose.yaml
     project_directory: ..
     env_file: ../another/.env

路径

path 是必需的,它定义了要解析并包含到本地 Compose 模型中的 Compose 文件的位置。当只有一个 Compose 文件时,path 可以设置为字符串;当需要将多个 Compose 文件合并在一起以定义要包含在本地应用程序中的 Compose 模型时,path 可以设置为字符串列表。

include:
   - path: 
       - ../commons/compose.yaml
       - ./commons-override.yaml

项目目录

project_directory 定义了一个基本路径,用于解析在 Compose 文件中设置的相对路径。它默认为包含的 Compose 文件的目录。

环境文件

env_file 定义了一个环境文件,用于在解析 Compose 文件时,定义插值变量的默认值。它默认为解析的 Compose 文件的 project_directory 中的 .env 文件。

当需要将多个环境文件合并以定义项目环境时,env_file 可以设置为字符串或字符串列表。

include:
   - path: ../another/compose.yaml
     env_file:
       - ../another/.env
       - ../another/dev.env

本地项目的环境优先于 Compose 文件中设置的值,以便本地项目可以覆盖值以进行自定义。

其他资源

有关使用 include 的更多信息,请参阅使用多个 Compose 文件