使用 include 来模块化 Compose 文件。需要Docker Compose 2.20.0 及以上版本。可以通过包含其他 Compose 文件来复用和模块化 Docker 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 # 由 another_domain 定义

每个被包含文件都作为独立的 Compose 项目加载

相对路径基于被包含文件自身的路径解析,而不是本地项目的目录

变量插值使用同文件夹下的 .env 文件,但会被本地项目的环境变量覆盖

长格式语法:完整语法提供对子项目解析的更多控制

include:
  - path: ../commons/compose.yaml
    project_directory: ..
    env_file: ../another/.env
  • path:文件路径,必需字段,定义要包含的 Compose 文件位置。可以设置为:
    • 字符串:单个 Compose 文件
    • 字符串列表:需要合并的多个 Compose 文件
include:
  - path:
      - ../commons/compose.yaml    # 基础配置
      - ./commons-override.yaml    # 覆盖配置
  • project_directory:项目目录,定义解析相对路径的基础路径,默认为被包含文件所在目录。
  • env_file:环境文件,定义用于变量插值的环境文件,默认为被包含文件项目目录中的 .env 文件。可以设置为:
  • 字符串:单个环境文件
  • 字符串列表:多个环境文件(合并使用)
include:
  - path: ../another/compose.yaml
    env_file:
      - ../another/.env      # 基础环境变量
      - ../another/dev.env   # 开发环境覆盖

本地项目的环境变量优先级最高,可以覆盖被包含文件中设置的值,实现自定义配置。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐