Include
使用 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 filemy-compose-include.yaml 管理 serviceB,后者包含一些副本、用于检查数据的 Web 界面、隔离网络、用于数据持久化的卷等。依赖 serviceB 的应用程序无需了解基础设施细节,并可将 Compose 文件作为其可信赖的构建模块加以使用。
这意味着管理 serviceB 的团队可以对其自身的数据库组件进行重构,以引入额外的服务,而无需影响任何依赖团队。这也意味着依赖团队在运行每个 Compose 命令时无需添加额外的标志。
包含和覆盖
Compose 在任何来自 include 的资源与包含的 Compose 文件中的资源发生冲突时都会报告错误。此规则可防止与包含的 Compose 文件作者所定义的资源产生意外冲突。然而,在某些情况下,您可能希望对包含的模型进行微调。这可以通过在 include 指令中添加一个覆盖文件来实现:
include:
- path :
- third-party/compose.yaml
- override.yaml # local override for third-party model这种方法的主要限制是,您需要为每个包含维护一个专用的覆盖文件。对于具有多个包含的复杂项目,这将导致产生许多 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 模型。