docker compose 实现环境差异化编排的核心是分层覆盖而非重复定义:以 docker-compose.yml 为通用基线,通过 -f 指定 dev 或 prod 覆盖文件实现精准定制;配合环境变量、profiles 和构建参数差异,确保开发与生产配置一致、安全、可维护。

用 Docker Compose 实现生产与开发环境差异化编排,核心不是写两份完全独立的 docker-compose.yml,而是通过复用 + 分层覆盖来保证一致性、减少重复、避免误配。
用多个 Compose 文件分层管理配置
Docker Compose 支持用 -f 指定多个文件,按顺序合并(后加载的覆盖前一个同名字段)。推荐结构:
-
docker-compose.yml:存放通用服务定义(如服务名、镜像、网络、卷挂载路径等)——所有环境共用 -
docker-compose.dev.yml:开发专用配置(如挂载源码、启用调试端口、使用本地构建、关闭健康检查) -
docker-compose.prod.yml:生产专用配置(如设置资源限制、启用 restart 策略、使用远端镜像、配置健康检查、关闭日志驱动调试)
启动时分别执行:
开发环境:docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d
生产环境:docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
环境变量驱动差异化行为
在 docker-compose.yml 中大量使用 ${VAR_NAME} 占位符,配合 .env 文件或运行时传入变量控制行为:
- 服务镜像名可设为
image: myapp:${APP_VERSION:-latest},开发时APP_VERSION=dev,生产时APP_VERSION=1.2.0 - 数据库连接地址可设为
DB_HOST: ${DB_HOST:-localhost},开发默认走宿主机,生产读取集群内网 DNS 名 - 通过
environment:注入不同配置项,比如NODE_ENV: ${NODE_ENV:-development}
注意:.env 文件只影响 Compose 解析阶段,不自动注入到容器内;如需注入容器,仍要显式写进 environment 或 env_file。
利用 profiles 控制服务启停范围
从 Compose v2.2+ 开始支持 profiles 字段,适合隔离非核心服务:
- 把 Elasticsearch、Kibana、Redis CLI 工具等仅开发需要的服务加上
profiles: ["dev"] - 启动时加
--profile dev才会包含这些服务:docker compose --profile dev -f ... up - 生产部署默认不加载任何 profile,自然跳过这些服务,无需注释或条件判断
镜像构建逻辑也要区分对待
开发环境常需热重载,生产要求最小化和确定性:
- 在
docker-compose.dev.yml中保留build:指向含dev阶段的 Dockerfile:target: dev - 在
docker-compose.prod.yml中改用已推送的镜像:image: registry.example.com/myapp:v1.2.0,并移除build:块 - 或者统一用
build:,但通过args传入不同构建参数,例如--build-arg ENV=prod
这样既保持 Dockerfile 单一可信源,又让构建行为随环境变化。
不复杂但容易忽略的是:确保生产 Compose 文件里禁用 stdin_open: true、tty: true,删掉 command: sh 类调试命令,并验证 healthcheck 是否合理生效。每次上线前用 docker compose config 查看最终合并结果,比靠记忆更可靠。











