扩展 Compose 文件
Docker Compose 的extends
属性允许您在不同的文件甚至不同的文件之间共享通用配置
项目。
如果您有多个服务重用一个通用的
配置选项集。跟extends
您可以定义一组通用的
服务选项,并可从任何位置引用它。您可以参考
另一个 Compose 文件,然后选择您自己也想使用的服务
应用程序,并能够根据自己的需要覆盖某些属性。
重要
使用多个 Compose 文件时,必须确保文件中的所有路径 是相对于基本 Compose 文件(即 main-project 文件夹中的 Compose 文件)的。这是必需的,因为扩展文件 不必是有效的 Compose 文件。扩展文件可以包含 配置。跟踪服务的哪个片段相对于哪个路径 困难且令人困惑,因此为了使路径更易于理解,所有路径都必须 相对于 base 文件进行定义。
运作方式
从另一个文件扩展服务
以以下示例为例:
services:
web:
extends:
file: common-services.yml
service: webapp
这会指示 Compose 仅重复使用webapp
服务
在common-services.yml
文件。这webapp
服务本身不是最终项目的一部分。
如果common-services.yml
如下所示:
services:
webapp:
build: .
ports:
- "8000:8000"
volumes:
- "/data"
您得到的结果与您编写的结果完全相同docker-compose.yml
替换为相同的build
,ports
和volumes
配置
直接在web
.
包含服务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
其他示例
当您拥有多个服务时,扩展单个服务非常有用 具有通用配置。以下示例是一个包含两个 services、Web 应用程序和 queue worker。两种服务使用相同的 代码库并共享许多配置选项。
这common.yaml
file 定义通用配置:
services:
app:
build: .
environment:
CONFIG_FILE_PATH: /code/config
API_KEY: xxxyyy
cpu_shares: 5
这docker-compose.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
例外和限制
volumes_from
和depends_on
永远不会在使用extends
.存在这些异常以避免隐式依赖关系;你总是
定义volumes_from
本地。这可确保服务之间的依赖关系
在读取当前文件时清晰可见。在本地定义这些
确保对引用文件的更改不会破坏任何内容。
extends
如果您只需要共享一个服务,并且您
熟悉要扩展到的文件,因此您可以调整
配置。但是,当您想要重复使用时,这不是一个可接受的解决方案
其他人不熟悉的配置,而您不知道自己的配置
依赖。
相对路径
使用extends
替换为file
指向另一个文件夹的属性、相对路径
被 extended 的服务所声明的
Extending 服务使用时相同的文件。以下示例对此进行了说明:
Base Compose 文件:
services:
webapp:
image: example
extends:
file: ../commons/compose.yaml
service: base
这commons/compose.yaml
文件:
services:
base:
env_file: ./container.env
生成的服务将引用原始的container.env
文件
在commons
目录。这可以通过docker compose config
检查实际模型:
services:
webapp:
image: example
env_file:
- ../commons/container.env