docker compose 通过多文件分层合并(base/env/override)与环境变量三级加载(.env → env_file → environment)实现轻量配置分发,结合 healthcheck 与 depends_on condition 确保配置生效与服务就绪同步。

用 Docker Compose 整合分布式配置下发机制,核心不是“推送配置到服务”,而是通过多文件合并 + 环境变量分层加载,让服务在启动时自动获取对应环境的最终配置。它不依赖外部配置中心(如 Nacos、Apollo),而是靠 Compose 自身的声明式叠加能力实现轻量、可靠、可版本化的配置分发。
分层定义配置文件,明确职责边界
把配置拆成三层,每层只管一件事:
- 基础层(docker-compose.base.yml):定义服务名、镜像、网络、卷、健康检查等所有环境共用结构,不写任何环境敏感值
- 环境层(docker-compose.prod.yml / .dev.yml / .test.yml):只覆盖端口、副本数、资源限制、环境变量(如 ENV=prod)、日志级别等差异化项
- 本地覆盖层(docker-compose.override.yml):开发机专用,比如挂载源码目录、开启调试端口、禁用 TLS —— 这个文件不提交 Git,加进 .gitignore
按顺序加载,后文件覆盖前文件
Docker Compose 按 -f 参数出现顺序依次读取并合并,后面的配置会覆盖前面同名字段:
- 执行
docker compose -f docker-compose.base.yml -f docker-compose.prod.yml up→ 先加载 base,再用 prod 覆盖关键字段 - 执行
docker compose up(无 -f)→ 默认加载docker-compose.yml和docker-compose.override.yml(如果存在) - 多个
env_file指令也按书写顺序加载,但变量最终以environment:字段为准(优先级最高)
环境变量三级加载,精准控制注入时机
配置值从三个来源注入,优先级由低到高:
-
.env 文件:仅用于替换 compose 文件中未定义的变量(如
${DB_PORT}),不能覆盖服务内显式设置 -
env_file 指令:每个服务可指定一个或多个 .env 类文件(如
env_file: - ./prod.env),内容被批量导入 -
environment 字段:直接写在 service 下,例如
- DATABASE_URL=postgresql://...,该值最终生效,会覆盖上面两个来源的同名变量
结合健康检查与 depends_on 实现配置就绪驱动
配置下发不是一蹴而就,服务真正可用需满足状态条件。利用 healthcheck + condition 可避免“配置已加载但服务未就绪”问题:
- 为数据库服务添加健康检查:
healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] - 在依赖它的服务中写:
depends_on: db: condition: service_healthy - 这样 Web 服务不会在 DB 容器启动后立刻启动,而是等到 DB 真正响应连接才继续 —— 配置已生效、服务已就绪,二者同步











