包含
使用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 UI、隔离的网络、用于数据持久化的卷等。依赖 serviceB 的应用程序不需要了解基础设施的详细信息,并将Compose文件作为可以依赖的构建块来使用。
这意味着管理serviceB的团队可以重构自己的数据库组件,以引入额外的服务,而不会影响任何依赖团队。这也意味着依赖团队不需要在他们运行的每个Compose命令中包含额外的标志。
包含和覆盖
如果include中的任何资源与包含的Compose文件中的资源发生冲突,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模型。