当前位置: 首页 > news >正文

第五部分-DockerCompose——24. 多环境配置

24. 多环境配置

1. 多环境配置概述

在实际开发中,通常需要在不同环境(开发、测试、生产)中使用不同的配置。Docker Compose 提供了多种方式实现多环境配置管理。

┌─────────────────────────────────────────────────────────────┐ │ 多环境配置架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ docker-compose.yml (基础配置) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ services: │ │ │ │ web: │ │ │ │ image: myapp │ │ │ │ ports: │ │ │ │ - "8080:80" │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ │ ┌─────────────────┼─────────────────┐ │ │ ▼ ▼ ▼ │ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ │ 开发环境 │ │ 测试环境 │ │ 生产环境 │ │ │ ├───────────┤ ├───────────┤ ├───────────┤ │ │ │ 热重载 │ │ 测试数据 │ │ 优化配置 │ │ │ │ 调试工具 │ │ Mock服务 │ │ 监控告警 │ │ │ │ 开发卷 │ │ 测试卷 │ │ 生产卷 │ │ │ └───────────┘ └───────────┘ └───────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘

2. 多文件覆盖

2.1 基础文件结构

compose/ ├── docker-compose.yml # 基础配置 ├── docker-compose.dev.yml # 开发覆盖 ├── docker-compose.test.yml # 测试覆盖 ├── docker-compose.prod.yml # 生产覆盖 └── docker-compose.override.yml # 自动覆盖(开发)

2.2 基础配置

# docker-compose.ymlversion:'3.8'services:web:image:myapp:latestports:-"80"environment:-NODE_ENV=productionhealthcheck:test:["CMD","curl","-f","http://localhost"]

2.3 开发覆盖

# docker-compose.dev.ymlversion:'3.8'services:web:build:.ports:-"3000:3000"environment:-NODE_ENV=development-DEBUG=truevolumes:-.:/app-/app/node_modulescommand:npm run devhealthcheck:disable:true

2.4 生产覆盖

# docker-compose.prod.ymlversion:'3.8'services:web:image:myapp:${TAG:-latest}ports:-"80:3000"environment:-NODE_ENV=productionrestart:alwayslogging:driver:json-fileoptions:max-size:"10m"max-file:"3"deploy:resources:limits:cpus:'1'memory:1G

2.5 使用多文件

# 开发环境docker-compose-fdocker-compose.yml-fdocker-compose.dev.yml up-d# 测试环境docker-compose-fdocker-compose.yml-fdocker-compose.test.yml up-d# 生产环境docker-compose-fdocker-compose.yml-fdocker-compose.prod.yml up-d# 指定多个文件docker-compose-fbase.yml-fdev.yml-flocal.yml config

3. 环境变量替换

3.1 基础使用

# docker-compose.ymlversion:'3.8'services:web:image:myapp:${TAG:-latest}ports:-"${WEB_PORT:-8080}:3000"environment:-DB_HOST=${DB_HOST:-localhost}-DB_PORT=${DB_PORT:-5432}-DB_USER=${DB_USER}-DB_PASSWORD=${DB_PASSWORD}

3.2 .env 文件

# .env(默认加载)TAG=1.0.0WEB_PORT=80DB_HOST=postgresDB_PORT=5432DB_USER=myuserDB_PASSWORD=secret# .env.devTAG=devWEB_PORT=3000DEBUG=true# .env.prodTAG=latestWEB_PORT=80LOG_LEVEL=info
# 使用特定 env 文件docker-compose--env-file .env.dev up-d# 合并多个 env 文件docker-compose--env-file .env --env-file .env.dev up-d

3.3 Shell 环境变量

# 导出环境变量exportDB_HOST=prod-db.example.comexportDB_PASSWORD=prod-secret# 使用环境变量docker-composeup-d# 使用环境变量覆盖docker-composerun-eDB_HOST=test-db webbash

4. 扩展字段

# docker-compose.ymlversion:'3.8'# 定义可复用的配置块x-logging:&default-loggingdriver:json-fileoptions:max-size:"10m"max-file:"3"x-resources:&default-resourcesresources:limits:cpus:'0.5'memory:512Mservices:web:image:nginxlogging:*default-loggingdeploy:*default-resourcesapi:image:myapilogging:*default-loggingdeploy:*default-resources# 覆盖部分配置worker:image:myworkerlogging:*default-loggingdeploy:resources:limits:cpus:'1'memory:1G

5. 环境特定配置

5.1 开发环境

# docker-compose.override.yml(自动加载)version:'3.8'services:web:build:context:.target:developmentvolumes:-.:/app-/app/node_modulesenvironment:-NODE_ENV=development-DEBUG=app:*command:npm run devports:-"9229:9229"# Node.js 调试端口db:ports:-"5432:5432"environment:-POSTGRES_PASSWORD=devpassredis:ports:-"6379:6379"

5.2 测试环境

# docker-compose.test.ymlversion:'3.8'services:web:build:context:.target:testenvironment:-NODE_ENV=test-DB_HOST=db-testdepends_on:-db-testcommand:npm testdb-test:image:postgres:13environment:-POSTGRES_DB=testdb-POSTGRES_USER=test-POSTGRES_PASSWORD=testtmpfs:-/var/lib/postgresql/data

5.3 生产环境

# docker-compose.prod.ymlversion:'3.8'services:web:image:registry.example.com/myapp:${TAG}ports:-"80:3000"environment:-NODE_ENV=production-LOG_LEVEL=inforestart:alwayslogging:driver:syslogoptions:syslog-address:"tcp://syslog.example.com:514"tag:"myapp-web"deploy:replicas:3update_config:parallelism:1delay:10srestart_policy:condition:on-failuredb:image:postgres:13environment:-POSTGRES_PASSWORD_FILE=/run/secrets/db_passwordsecrets:-db_passwordvolumes:-db-data:/var/lib/postgresql/datadeploy:placement:constraints:[node.role == manager]secrets:db_password:external:true

6. 配置模板示例

6.1 完整项目结构

project/ ├── docker-compose.yml ├── docker-compose.dev.yml ├── docker-compose.prod.yml ├── .env ├── .env.dev ├── .env.prod ├── config/ │ ├── dev/ │ │ └── nginx.conf │ └── prod/ │ └── nginx.conf └── scripts/ ├── dev-entrypoint.sh └── prod-entrypoint.sh

6.2 Makefile 管理

# Makefile .PHONY: dev prod test clean dev: docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d prod: docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d test: docker-compose -f docker-compose.yml -f docker-compose.test.yml run --rm web npm test clean: docker-compose down -v logs-dev: docker-compose -f docker-compose.yml -f docker-compose.dev.yml logs -f exec-dev: docker-compose -f docker-compose.yml -f docker-compose.dev.yml exec web bash

7. 最佳实践

✅ 推荐做法

  1. 基础配置放在 docker-compose.yml
  2. 环境特定配置放在独立文件
  3. 敏感信息使用环境变量或 secrets
  4. 使用 .env 文件管理环境变量
  5. 扩展字段复用配置
  6. 版本控制只提交基础配置

❌ 避免事项

  • 硬编码敏感信息
  • 在配置文件中使用不同的版本号
  • 忘记 .gitignore 忽略 .env 文件
  • 覆盖过于复杂导致难以维护

8. 常见问题

Q1: 如何查看合并后的配置?

docker-compose-fdocker-compose.yml-fdocker-compose.dev.yml config

Q2: 环境变量优先级?

Shell 环境 > .env 文件 > Compose 文件

Q3: 如何忽略 .env 文件?

添加到 .gitignore:.env .env.* !.env.example

9. 小结

  • 多文件覆盖:不同环境使用不同覆盖文件
  • 环境变量:支持 .env 文件和 shell 变量
  • 扩展字段:复用通用配置
  • 敏感信息:使用 secrets 或环境变量
  • 版本控制:提交示例文件,忽略真实配置
  • Makefile:简化环境切换命令

http://www.jsqmd.com/news/795404/

相关文章:

  • 5G网络中的存储功能革新:NRF技术深度解析
  • 2026重庆装修公司口碑排名:本润装饰拔得头筹,权威数据揭秘行业实情 - 大渝测评
  • 2026合肥十大专业灭鼠公司深度测评|优选合肥虫克星杀虫实测 - 资讯焦点
  • 江苏全屋定制深度避坑指南:风佳木护墙板、实木柜防潮防裂工艺解析 - 优质企业观察收录
  • 靠谱的装修企业推荐,中建盛世怎么样? - myqiye
  • 2026佛山奢侈品包包回收权威榜:5家头部机构实测打分与避坑指南 - 奢侈品回收测评
  • 付费通卡回收目前行情怎样?京回收为你揭晓全过程 - 猎卡回收公众号
  • 5步实现Foobar2000精准歌词同步:ESLyric歌词源完整配置指南
  • 2026年资质齐全的本地整装品牌企业排名 - myqiye
  • AI Agent 的“技能焦虑“:从“什么都能做“到“什么该做“
  • 终极指南:华为光猫配置解密工具深度解析与应用实践
  • 从OpenClaw到企业级AI Agent:重塑营销自动化的算力底座
  • 保姆级教程:用ArcGIS Pro把全国气象站点数据做成动态时空立方体(附NOAA数据下载)
  • 2026北京黄金回收靠谱门店推荐TOP5:收的顶稳居榜首 - 奢侈品回收测评
  • 为什么内行 HR 都选大型团建公司?看完佳天下的流程我懂了 - 佳天下国旅
  • 别再死记硬背了!用几个生活化例子彻底搞懂C#里的virtual和override
  • 如何用5分钟完成淘宝淘金币任务:新手完全自动化指南
  • 无锡高端整木家装真相揭秘:为什么原木定制比板式家具多值这个价格 - 优质企业观察收录
  • 免费开源AMD Ryzen调试工具SMUDebugTool:终极硬件掌控指南
  • 【AI研发知识管理终极指南】:SITS2026权威框架首次深度解密,3大认知盲区正在拖垮你的AI工程化落地?
  • MyTV-Android:让老旧电视焕发新生的终极免费电视直播解决方案
  • 关于多维空间的理解
  • 如何在Mac上快速搭建免费局域网通信工具:飞秋Mac版终极指南
  • Python AutoCAD自动化开发指南:如何用5行代码替代8小时重复绘图工作
  • QMC解码器终极部署指南:3步解锁加密音乐文件转换秘籍
  • 无锡梅雨季整木定制开裂怎么办?风佳木20年防潮工艺实测解析 - 优质企业观察收录
  • 抖音批量下载终极指南:如何快速免费下载无水印视频
  • 上海爱彼回收 门店真实报价 内幕避坑 - 奢侈品回收测评
  • 5G统一数据管理(UDM):构建高效智能网络的核心引擎
  • 终极指南:3分钟掌握Typora插件,让写作效率提升300%