用多文件叠加和环境变量分层可干净分离开发、测试、生产三套配置:基础配置(compose.yaml)定义共性服务结构与网络,各环境覆盖文件(compose.dev.yaml等)仅描述差异,启动时通过-f参数或compose_file动态组合,并辅以.env文件和命令行环境变量实现细粒度控制。

用多文件叠加 + 环境变量分层,就能干净地实现开发、测试、生产三套配置分离。核心不是写三份完全独立的文件,而是把共性抽出来,差异单独覆盖。
基础配置统一定义
所有环境都共用的服务结构、网络、卷定义,写在 compose.yaml(或 docker-compose.yml)里:
- 服务名、镜像基础路径、依赖关系(depends_on)、默认端口映射(如 8080:8080)
- 共享网络(如 default 网络或自定义 bridge)、命名卷声明(volumes)、健康检查模板
- 避免在这里写 ENV=dev 或 volume 挂载路径——这些属于环境差异,不该放这里
按环境拆分覆盖文件
每个环境只描述“它和基础配置不一样的地方”,用独立 YAML 文件管理:
-
compose.dev.yaml:启用
volumes挂载源码、设environment: NODE_ENV=development、暴露调试端口(如 9229)、日志级别调为 debug - compose.test.yaml:固定镜像 tag(如 myapp:v1.2.0-test)、连接隔离的测试数据库、启用测试钩子(如 wait-for-it.sh)、限制 CPU/Memory 防止影响其他任务
-
compose.prod.yaml:关闭调试、删掉所有本地卷挂载、加
deploy.resources限制、配 SSL 终结、设restart: unless-stopped、用私有 registry 镜像地址
启动时动态组合配置
不改代码、不复制文件,靠命令行指定组合方式:
- 开发:
docker compose -f compose.yaml -f compose.dev.yaml up - 测试:
docker compose -f compose.yaml -f compose.test.yaml up - 生产:
docker compose -f compose.yaml -f compose.prod.yaml up -d - 也可用
COMPOSE_FILE环境变量简化:COMPOSE_FILE="compose.yaml:compose.prod.yaml" docker compose up -d
环境变量做细粒度控制
文件之外,再加一层运行时灵活性:
- 在
.env放通用默认值(如APP_VERSION=latest) - 各环境配专属
.env.prod、.env.test,通过env_file:引入 - 命令行可临时覆盖:
docker compose --env-file .env.prod up,或直接ENV=prod docker compose up - 注意优先级:命令行 > env_file > compose 文件内 environment > .env 文件 > 系统环境变量











