核心是通用配置抽离、差异配置分离,通过加载顺序控制生效:基础文件(docker-compose.yml)仅定义共性内容如服务名、占位符镜像、网络、卷声明等;dev/prod 覆盖文件只改需变项;启动时用 -f 指定顺序,后加载者覆盖前者;环境变量(.env 文件或 --env-file)注入动态值,敏感信息不硬编码。

核心是把通用配置抽出来,差异部分单独写,启动时按需组合——不是复制粘贴改文件,而是用加载顺序控制谁生效。
基础文件只放共性配置
在 docker-compose.yml 里定义所有环境都一样的内容:服务名、镜像名(可带占位符)、网络、卷声明、健康检查模板、默认 environment 键(不填具体值)。避免在这里写具体端口、数据库地址或资源限制。
- 镜像用
${APP_IMAGE:-myapp:latest},靠环境变量或 .env 文件注入实际值 - volumes 只声明命名卷名(如
pgdata:),不挂载宿主机路径 - environment 列表写通用键,比如
- LOG_LEVEL=info,具体值留到覆盖文件里定
开发与生产各建一个覆盖文件
docker-compose.dev.yml 专注本地调试:挂载源码、开放调试端口、用内存数据库、关闭日志轮转;docker-compose.prod.yml 聚焦稳定运行:固定镜像 tag、设 CPU/内存限制、连真实 DB、启用 TLS 和健康检查。
- dev 文件中可以加
volumes: ["./src:/app/src"]和ports: ["3000:3000", "9229:9229"] - prod 文件中改
image: myapp:v1.5.2,加deploy: {resources: {limits: {memory: 1g}}} - 两个文件都不重复写
networks:或volumes:声明,只覆盖需要变的部分
启动命令决定最终环境
用 -f 显式指定加载顺序。后一个文件优先级更高,同名字段会覆盖前一个。
- 本地开发:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up - 模拟生产:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d - CI 流水线里可统一用 prod 文件,但通过
--env-file .env.production注入密钥和地址
环境变量辅助动态填充
YAML 中的 ${DB_HOST}、${REDIS_URL} 等占位符,由 .env 文件或 shell 环境提供值。不同环境用不同 .env 文件,和 compose 文件解耦。
- .env.dev 写
DB_HOST=localhost,.env.prod 写DB_HOST=prod-db.internal - 启动时自动加载项目根目录下的 .env,也可用
--env-file指定其他路径 - 敏感值(如密码)绝不硬编码进 YAML,全走环境变量注入


















