扩展你的 Compose 文件
Docker Compose 的 extends 属性 允许你在不同的文件甚至完全不同的项目之间共享通用配置。
如果你有多个服务重用一组通用配置选项,扩展服务会很有用。使用 extends,你可以在一个地方定义一组通用服务选项,并从任何地方引用它。你可以引用另一个 Compose 文件并选择你想要在自己的应用程序中使用的服务,并能够根据自己的需求覆盖某些属性。
重要当你使用多个 Compose 文件时,你必须确保文件中的所有路径都是相对于基本 Compose 文件(即主项目文件夹中的 Compose 文件)的。这是因为扩展文件不必是有效的 Compose 文件。扩展文件可以包含小的配置片段。跟踪服务的哪个片段相对于哪个路径是困难且令人困惑的,因此为了使路径更容易理解,所有路径都必须相对于基本文件定义。
extends 属性的工作原理
从另一个文件扩展服务
请看以下示例
services:
web:
extends:
file: common-services.yml
service: webapp这指示 Compose 只重用 common-services.yml 文件中定义的 webapp 服务的属性。webapp 服务本身不属于最终项目。
如果 common-services.yml 看起来像这样
services:
webapp:
build: .
ports:
- "8000:8000"
volumes:
- "/data"你将获得与直接在 web 下定义相同的 build、ports 和 volumes 配置值写入 compose.yaml 完全相同的结果。
要从另一个文件扩展服务时将服务 webapp 包含在最终项目中,你需要在当前的 Compose 文件中显式包含这两个服务。例如(这仅用于说明目的)
services:
web:
build: alpine
command: echo
extends:
file: common-services.yml
service: webapp
webapp:
extends:
file: common-services.yml
service: webapp或者,你可以使用 include。
在同一文件内扩展服务
如果你在同一个 Compose 文件中定义服务并从另一个服务扩展一个服务,则原始服务和扩展服务都将成为你最终配置的一部分。例如
services:
web:
build: alpine
extends: webapp
webapp:
environment:
- DEBUG=1在同一文件内和从另一个文件扩展服务
你可以进一步在 compose.yaml 中本地定义或重新定义配置
services:
web:
extends:
file: common-services.yml
service: webapp
environment:
- DEBUG=1
cpu_shares: 5
important_web:
extends: web
cpu_shares: 10附加示例
当你拥有具有通用配置的多个服务时,扩展单个服务很有用。以下示例是一个包含两个服务的 Compose 应用程序,一个 Web 应用程序和一个队列工作器。这两个服务使用相同的代码库并共享许多配置选项。
common.yaml 文件定义了通用配置
services:
app:
build: .
environment:
CONFIG_FILE_PATH: /code/config
API_KEY: xxxyyy
cpu_shares: 5compose.yaml 定义了使用通用配置的具体服务
services:
webapp:
extends:
file: common.yaml
service: app
command: /code/run_web_app
ports:
- 8080:8080
depends_on:
- queue
- db
queue_worker:
extends:
file: common.yaml
service: app
command: /code/run_worker
depends_on:
- queue相对路径
当使用带有指向另一个文件夹的 file 属性的 extends 时,被扩展服务声明的相对路径会被转换,以便它们在被扩展服务使用时仍指向同一个文件。这在以下示例中进行说明
基本 Compose 文件
services:
webapp:
image: example
extends:
file: ../commons/compose.yaml
service: basecommons/compose.yaml 文件
services:
base:
env_file: ./container.env生成的服务引用 commons 目录中的原始 container.env 文件。这可以通过 docker compose config 进行确认,它会检查实际模型
services:
webapp:
image: example
env_file:
- ../commons/container.env