包含
使用 include
,你可以将一个单独的 compose.yaml
文件直接合并到当前的 compose.yaml
文件中。这使得将复杂应用程序模块化为子 Compose 文件变得容易,从而使应用程序配置更简单、更清晰。
include
顶级元素有助于直接在配置文件组织中反映负责代码的工程团队。它还解决了 extends
和 merge
存在的相对路径问题。
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 和覆盖
如果 include
中的任何资源与包含的 Compose 文件中的资源发生冲突,Compose 会报告错误。此规则可防止与包含的 compose 文件作者定义的资源发生意外冲突。但是,在某些情况下,你可能需要调整包含的模型。这可以通过向 include 指令添加覆盖文件来实现
include:
- path :
- third-party/compose.yaml
- override.yaml # local override for third-party model
这种方法的主要限制是,你需要为每个 include 维护一个专用的覆盖文件。对于包含多个 includes 的复杂项目,这将导致大量的 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 模型。