使用 include 将 Compose 文件模块化
通过包含其他 Compose 文件,可以重用 Docker 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 fileCompose 还支持将插值变量与 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 文件的位置。
path 可以设置为:
- 一个字符串:当使用单个 Compose 文件时。
- 一个字符串列表:当多个 Compose 文件需要合并在一起以定义本地应用程序的 Compose 模型时。
include:
- path:
- ../commons/compose.yaml
- ./commons-override.yaml项目目录
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 文件