核心是分离配置与逻辑,利用多文件叠加(-f)和变量替换(${var})实现动态切换;推荐“基础+环境覆盖”模式,配合profiles按需激活服务、.env变量注入及env_file运行时传参。

通过 docker-compose.yml 实现多环境动态切换,核心是分离配置与逻辑,利用 Compose 的多文件叠加(-f)和变量替换(${VAR})能力,而不是硬编码不同环境的文件。
用多个 compose 文件分层管理环境
推荐采用「基础 + 环境覆盖」模式:一个 docker-compose.yml 定义通用服务结构,再为每个环境准备独立的覆盖文件(如 docker-compose.prod.yml、docker-compose.dev.yml),通过 docker-compose -f 指定组合加载。
- 基础文件(docker-compose.yml):只写共用部分——服务名、镜像、端口映射、卷挂载结构、健康检查等不随环境变的内容
-
环境文件(如 docker-compose.dev.yml):只覆盖差异项——环境变量(
environment)、资源限制(mem_limit)、开发用卷(./src:/app/src)、调试端口(3001:3001)等 - 运行开发环境:
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} 占位符,启动前通过 shell 环境或 .env 文件赋值。Compose 会自动读取当前目录下的 .env(无需显式指定),适合管理数据库地址、密钥前缀等轻量级差异。
- 在
.env中写:DB_HOST=postgres-prod、LOG_LEVEL=warn - 在 compose 文件中引用:
environment: - DB_HOST=${DB_HOST} - 也可临时覆盖:
DB_HOST=localhost docker-compose up,优先级高于.env - 注意:变量未定义时默认为空,建议在关键字段后加默认值,如
${LOG_LEVEL:-info}
用 profiles 控制按需启用服务
某些服务只在特定环境运行(如 dev 环境的 nginx-proxy-manager 或 prod 环境的 prometheus),可用 profiles 字段标记,并通过 --profile 参数激活。
- 在服务下添加:
profiles: ["monitoring"] - 启动时指定:
docker-compose --profile monitoring up - 可叠加多个 profile:
--profile dev --profile debug - 未指定 profile 的服务始终启动;指定但未启用的则跳过
避免常见坑点
多环境配置容易因路径、变量作用域或文件加载顺序出错,需特别注意:
- 覆盖文件中的同名服务会深度合并(非全量替换):比如基础文件定义了
volumes,环境文件也写volumes,两者会合并而非覆盖后者 -
.env文件只影响 compose 解析阶段,不影响容器内进程的环境变量;容器内要用environment或env_file显式传入 - 不要在
docker-compose.yml中硬编码敏感信息(如密码),应通过env_file外部引入,并将该文件加入.gitignore - 本地测试时,确保
docker-compose版本 ≥ 1.28(支持 profiles)或 ≥ 2.0(推荐用 Docker Desktop 内置新版)











