包含

Introduced in Docker Compose version 2.20.0

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

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

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

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

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

从包含的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

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

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

project_directory

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

env_file

env_file 定义了在解析Compose文件时用于定义默认值的环境文件。它默认为正在解析的Compose文件的project_directory中的.env文件。

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

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

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

额外资源

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