Docker Compose多环境配置核心是文件分层与变量分级:通过compose.yaml(基础)+ compose.dev.yaml/compose.prod.yaml等(环境覆盖)组合叠加,配合.env文件、--env-file及service.environment四级变量优先级机制,实现零代码修改的动态配置生成。
Docker Compose 实现多环境配置分离,核心是“文件分层 + 变量分级”,不靠改代码,也不靠手动替换,而是通过组合不同配置文件和环境变量来动态生成最终配置。
把配置拆成基础层和环境层,启动时按需叠加:
运行命令示例:
开发环境:
docker compose -f compose.yaml -f compose.dev.yaml up -d
生产环境:
docker compose -f compose.yaml -f compose.prod.yaml up -d
变量按作用范围和优先级分四层,后加载的同名变量会覆盖前面的:
export DATABASE_URL=...)——优先级最低APP_NAME=myapp
--env-file .env.prod
推荐做法:把通用变量放 .env.common,再为每个环境建 .env.dev、.env.prod,启动时显式加载:
docker compose --env-file .env.common --env-file .env.prod up -d
避免重复写死值,让同一份 compose.yaml 适配不同环境:
${VAR_NAME} 引用变量,支持默认值写法:${LOG_LEVEL:-info}
DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}
image: myapp:${IMAGE_TAG:-latest},本地开发用 dev,CI 流水线传 v1.2.0
变量来源可以是 .env、--env-file 或 shell 导出,Compose 自动解析。
光配参数不够,还要防止环境间互相干扰:
networks: [app-net-${ENV_NAME:-dev}],避免容器名冲突或跨环境通信volumes: [pgdata-${ENV_NAME:-dev}:/var/lib/postgresql/data]
bind mount 挂载代码,生产环境用 copy 进镜像,两者互不耦合