一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Docker Compose 如何实现多环境的配置分离管理

时间:2026-08-24 08:16:49 编辑:袖梨 来源:一聚教程网

Docker Compose多环境配置核心是文件分层与变量分级:通过compose.yaml(基础)+ compose.dev.yaml/compose.prod.yaml等(环境覆盖)组合叠加,配合.env文件、--env-file及service.environment四级变量优先级机制,实现零代码修改的动态配置生成。

Docker Compose 实现多环境配置分离,核心是“文件分层 + 变量分级”,不靠改代码,也不靠手动替换,而是通过组合不同配置文件和环境变量来动态生成最终配置。

用多个 YAML 文件做分层覆盖

把配置拆成基础层和环境层,启动时按需叠加:

  1. compose.yaml(或 docker-compose.yml):只放所有环境共用的部分,比如服务名、镜像、基础端口、网络定义、卷声明
  2. compose.dev.yaml:开发专用,例如挂载本地源码、开启调试端口、使用轻量数据库镜像、禁用日志压缩
  3. compose.prod.yaml:生产专用,比如设置 restart: always、限制内存/CPU、启用 HTTPS 端口、连接外部 RDS、关闭调试功能
  4. compose.test.yaml:测试专用,可预置测试数据库初始化脚本、缩短健康检查间隔、启用覆盖率收集

运行命令示例:

开发环境:

docker compose -f compose.yaml -f compose.dev.yaml up -d

生产环境:

docker compose -f compose.yaml -f compose.prod.yaml up -d

用 .env 文件管理环境变量

变量按作用范围和优先级分四层,后加载的同名变量会覆盖前面的:

  1. 系统环境变量(宿主机全局,如 export DATABASE_URL=...)——优先级最低
  2. .env(项目根目录,自动加载)——适合默认值,比如 APP_NAME=myapp
  3. --env-file(命令行指定)——灵活切换,如 --env-file .env.prod
  4. service.environment(YAML 中直接写)——最高优先级,仅影响单个服务,适合临时调试

推荐做法:把通用变量放 .env.common,再为每个环境建 .env.dev.env.prod,启动时显式加载:

docker compose --env-file .env.common --env-file .env.prod up -d

在 YAML 中用变量插值复用配置

避免重复写死值,让同一份 compose.yaml 适配不同环境:

  1. ${VAR_NAME} 引用变量,支持默认值写法:${LOG_LEVEL:-info}
  2. 数据库地址可统一写成:DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}
  3. 镜像标签也可变量化:image: myapp:${IMAGE_TAG:-latest},本地开发用 dev,CI 流水线传 v1.2.0

变量来源可以是 .env--env-file 或 shell 导出,Compose 自动解析。

配合自定义网络与命名卷实现环境隔离

光配参数不够,还要防止环境间互相干扰:

  1. 每个环境用独立网络:networks: [app-net-${ENV_NAME:-dev}],避免容器名冲突或跨环境通信
  2. 数据库数据卷也带环境后缀:volumes: [pgdata-${ENV_NAME:-dev}:/var/lib/postgresql/data]
  3. 开发环境用 bind mount 挂载代码,生产环境用 copy 进镜像,两者互不耦合

热门栏目