关键在于分层设计与按需叠加:基础配置(compose.yaml)统一服务骨架、网络、卷等并使用变量占位;环境专属文件(如compose.dev.yaml)仅覆盖差异项;通过.env或命令行注入变量实现运行时动态控制。

用一套配置文件适配开发、测试、生产环境,关键不是写三套 YAML,而是分层设计 + 按需叠加。核心就两点:基础定义统一,差异部分外置。
基础配置文件(所有环境共用)
单独建一个 compose.yaml(或 docker-compose.yml),只放不变的部分:服务骨架、网络定义、卷声明、镜像基础名、通用端口映射(如内部通信端口)、健康检查模板等。不写具体值,多用变量占位,比如 ${APP_VERSION}、${DB_USER}。
- 避免在基础文件里硬编码密码、调试开关、资源限制
- 数据库连接字符串用变量拼接,而不是写死 host 或 port
- 所有 service 的
image字段保留 tag 占位符,方便不同环境注入不同版本
环境专属覆盖文件(按需叠加)
为每个环境建独立文件,如 compose.dev.yaml、compose.test.yaml、compose.prod.yaml。它们不重复定义服务,只覆盖需要改的部分:
-
开发环境:加
volumes挂载源码、开ports调试端口、设environment为 DEBUG=true、用build:本地构建 - 测试环境:调整数据库初始化脚本路径、启用测试专用中间件、设置较宽松的超时和重试
-
生产环境:关掉 TTY、加
restart: always、设deploy.resources.limits、删掉所有 dev-only 端口、用image:拉取带 SHA 校验的镜像
环境变量注入(运行时动态控制)
通过 .env 文件或系统环境变量提供敏感值和可变参数,优先级高于 YAML 文件:
- 在项目根目录放
.env(gitignore 掉),写DB_USER=prod_user、APP_VERSION=1.2.0 - 启动时自动加载:
docker compose up默认读 .env;也可用--env-file指定其他文件 - 命令行参数优先级最高:
APP_VERSION=2.0.0 docker compose -f compose.yaml -f compose.prod.yaml up
启动命令按环境切换(无需改代码)
用 -f 参数组合配置,保持命令语义清晰:
- 开发:
docker compose -f compose.yaml -f compose.dev.yaml up - 测试:
docker compose -f compose.yaml -f compose.test.yaml up -d - 生产:
docker compose -f compose.yaml -f compose.prod.yaml --env-file .env.prod up -d - 还可把常用组合存成别名或 shell 脚本,比如
./scripts/up-prod.sh
不复杂但容易忽略


















