extends 用于复用配置,实现“定义一次,多处继承”,仅继承完整服务配置块,支持跨文件和同文件继承,可覆盖或追加属性,需避免循环继承,并宜与 override 文件配合使用。

直接用 extends 复用配置,核心是“定义一次,多处继承”——它不是万能的魔法,但能大幅减少重复,尤其适合多环境或多服务共享基础设置的场景。
明确 extends 的继承范围
extends 只继承目标服务的完整配置块(包括 image、environment、volumes、networks 等字段),不支持只继承某几个字段。继承后,当前服务可覆盖或追加属性,比如额外暴露端口、修改环境变量。
- 被继承的服务必须已定义,且名称准确匹配(区分大小写)
- 若跨文件继承,
file路径为相对路径,从当前docker-compose.yml所在目录开始解析 - 不能循环继承:A extends B,B 就不能再 extends A
跨文件复用通用服务模板
把中间件(如 Redis、PostgreSQL)或基础应用(如 Nginx、API 网关)抽成独立的 common.yml,再在各环境文件中按需继承:
例如 common.yml 定义:
version: '3.8'
services:
base-redis:
image: redis:7.2-alpine
command: ["--appendonly", "yes"]
volumes:
- redis-data:/data
在 docker-compose.prod.yml 中复用:
version: '3.8'
services:
cache:
extends:
file: common.yml
service: base-redis
ports:
- "6380:6379" # 生产环境映射不同端口
同文件内复用简化多实例部署
同一项目中多个相似服务(如多个 worker 实例),可用 extends 避免复制粘贴:
- 先定义一个基准服务(如
worker-base),含镜像、资源限制、健康检查等共性配置 - 再声明具体服务(如
worker-a、worker-b),通过extends继承,并各自指定command或environment - 注意:同文件继承时可省略
file字段,只写service: worker-base
配合环境变量和 override 文件更灵活
extends 本身不解析变量,但继承后的字段可以引用 ${VAR};实际使用中建议把它和 -f 多文件组合搭配:
- 用
base.yml定义通用服务结构 - 用
dev.override.yml和prod.override.yml分别覆盖端口、日志路径、资源限制等差异项 - 运行时执行
docker-compose -f base.yml -f prod.override.yml up,此时extends仍有效,继承关系不受 override 影响











