包括
使用
include
顶级元素,您可以将单独的 Compose 文件直接包含在本地 Compose 文件中。这解决了extends
和
merge存在的相对路径问题
。
include
可以更轻松地将复杂的应用程序模块化为子 Compose 文件。这使得应用程序配置变得更简单、更明确。这也有助于在配置文件组织中反映负责代码的工程团队。
本节中列出的每个路径都include
作为单独的 Compose 应用程序模型加载,并具有自己的项目目录,以便解析相对路径。
一旦加载包含的 Compose 应用程序,所有资源都会复制到当前的 Compose 应用程序模型中。
笔记
include
递归应用,因此声明其自己部分的包含的 Compose 文件include
也会包含其他文件。
例子
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
如果任何资源与包含的 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 模型。