予枫个人主页 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》 Debug 这个世界Return 更好的自己引言做后端开发的同学大概率踩过这些坑数据库密码硬编码到代码提交仓库后暴露风险Dev/Test/Prod环境用不同镜像重复构建浪费时间配置修改后必须重新打包镜像才能生效。其实这些问题用环境变量配置管理就能一次性解决本文手把手教你用-e参数、.env文件管理配置实现一份镜像多环境无缝运行新手也能快速上手文章目录引言一、环境变量基础为什么不用硬编码配置二、实操1用-e参数动态传递配置快速上手2.1 核心语法2.2 实战案例传递数据库配置2.3 容器内查看环境变量三、实操2用.env文件管理配置规范高效3.1 .env文件格式规范示例.env文件数据库Profile配置3.2 加载.env文件启动容器3.3 进阶.env文件分环境管理四、核心实战一份镜像实现多环境运行Profile配置4.1 项目配置准备关键步骤4.2 构建镜像仅构建一次4.3 多环境启动复用同一镜像五、注意事项与最佳实践避坑重点六、结尾总结一、环境变量基础为什么不用硬编码配置在Docker部署中配置硬编码比如把数据库密码、接口地址直接写进代码/配置文件是大忌不仅存在安全隐患还会导致“一套代码适配一个环境”部署效率极低。而环境变量就是解决这个问题的核心——它相当于给容器传递“动态参数”容器启动时读取这些参数无需修改镜像本身就能适配不同运行环境。✅ 环境变量的3个核心优势安全敏感配置如数据库密码、密钥不写入代码/镜像降低泄露风险灵活启动容器时动态传参一份镜像可适配Dev/Test/Prod多环境高效配置修改无需重新打包镜像重启容器即可生效提示觉得有用的同学记得点赞收藏后续部署多环境时直接套用二、实操1用-e参数动态传递配置快速上手最基础的环境变量传递方式就是通过docker run命令中的-e参数全称environment直接指定配置键值对适合临时测试或简单配置场景。2.1 核心语法# 单个环境变量dockerrun -d -e 配置键配置值 镜像名# 多个环境变量两种写法均可dockerrun -d -eKEY1VALUE1 -eKEY2VALUE2 镜像名dockerrun -d --envKEY1VALUE1 --envKEY2VALUE2 镜像名2.2 实战案例传递数据库配置假设我们部署一个Java项目需要传递数据库地址、用户名、密码无需修改项目代码启动时用-e传参即可# 启动容器传递数据库相关环境变量dockerrun -d\-p8080:8080\-eDB_URLjdbc:mysql://localhost:3306/testdb\-eDB_USERroot\-eDB_PASS123456\# 实际生产环境请用复杂密码--name demo-app\demo-image:1.02.3 容器内查看环境变量如果想确认环境变量是否传递成功可进入容器查看# 进入容器dockerexec-it demo-app /bin/bash# 查看所有环境变量env# 查看指定环境变量echo$DB_URL注意-e参数传递的配置仅在当前容器启动时生效容器重启后若未重新指定会恢复默认值适合临时测试不适合生产环境长期使用。三、实操2用.env文件管理配置规范高效当配置项较多比如10个时用-e参数逐个传递会非常繁琐且容易遗漏、写错。这时就需要.env文件将所有环境变量统一管理启动容器时直接加载文件即可。3.1 .env文件格式规范文件名固定为.env可自定义但推荐默认名称每一行写一个配置键值对格式KEYVALUE等号前后不要加空格注释用#开头注释行不会被加载敏感配置无需加密后续会说生产环境加密方案但不要提交到代码仓库需在.gitignore中忽略示例.env文件数据库Profile配置# 数据库配置敏感信息不提交到仓库 DB_URLjdbc:mysql://localhost:3306/testdb DB_USERroot DB_PASS123456789 # 环境Profile配置Dev/Test/Prod区分 SPRING_PROFILES_ACTIVEdev # dev开发环境test测试环境prod生产环境 # 其他配置 APP_PORT8080 LOG_LEVELinfo3.2 加载.env文件启动容器使用docker run命令时通过--env-file参数指定.env文件路径即可自动加载所有配置# 加载当前目录下的.env文件启动容器dockerrun -d\-p8080:8080\--env-file .env\# 加载.env文件--name demo-app\demo-image:1.03.3 进阶.env文件分环境管理为了更清晰地区分多环境我们可以创建多个.env文件比如.env.dev开发、.env.test测试、.env.prod生产启动时指定对应文件即可# 开发环境加载.env.devdockerrun -d --env-file .env.dev --name demo-app-dev demo-image:1.0# 测试环境加载.env.testdockerrun -d --env-file .env.test --name demo-app-test demo-image:1.0# 生产环境加载.env.proddockerrun -d --env-file .env.prod --name demo-app-prod demo-image:1.0提示生产环境中.env文件建议放在服务器非代码目录且设置文件权限如chmod 600 .env仅管理员可查看进一步提升安全性。四、核心实战一份镜像实现多环境运行Profile配置有了环境变量和.env文件我们就能实现“一份镜像多环境运行”——核心是通过SPRING_PROFILES_ACTIVEJava项目、NODE_ENVNode.js项目等Profile配置让应用启动时加载对应环境的配置文件。这里以Java Spring Boot项目为例其他语言思路一致。4.1 项目配置准备关键步骤在Spring Boot项目的resources目录下创建3个配置文件application-dev.yml开发环境配置端口8080、调试模式开启application-test.yml测试环境配置端口8081、调试模式关闭application-prod.yml生产环境配置端口80、调试模式关闭、日志级别warn核心配置application.yml指定默认Profile同时读取环境变量中的Profile配置spring:profiles:active:${SPRING_PROFILES_ACTIVE:dev}# 优先读取环境变量默认dev环境4.2 构建镜像仅构建一次编写Dockerfile打包项目镜像无需区分环境镜像通用FROM openjdk:11-jre-slim WORKDIR /app COPY target/demo-app-1.0.jar /app/demo-app.jar # 不指定环境变量启动时动态传递 ENTRYPOINT [java, -jar, demo-app.jar]构建镜像dockerbuild -t demo-app:1.0.4.3 多环境启动复用同一镜像通过加载不同的.env文件传递不同的SPRING_PROFILES_ACTIVE值实现多环境运行# 1. 开发环境加载.env.devProfiledev端口8080dockerrun -d --env-file .env.dev -p8080:8080 --name demo-dev demo-app:1.0# 2. 测试环境加载.env.testProfiletest端口8081dockerrun -d --env-file .env.test -p8081:8081 --name demo-test demo-app:1.0# 3. 生产环境加载.env.prodProfileprod端口80dockerrun -d --env-file .env.prod -p80:80 --name demo-prod demo-app:1.0✅ 验证多环境是否生效访问http://localhost:8080开发环境返回dev标识访问http://localhost:8081测试环境返回test标识访问http://localhost生产环境返回prod标识这样一来我们只需要构建一次镜像就能部署到3个不同环境极大提升部署效率也避免了多环境镜像不一致的问题。五、注意事项与最佳实践避坑重点敏感配置安全.env文件不要提交到代码仓库生产环境可结合Docker Secrets、K8s ConfigMap等工具加密管理。配置优先级-e参数传递的配置 .env文件中的配置 容器内部默认配置可灵活覆盖。避免冗余配置多环境共用的配置如数据库驱动可放在项目默认配置文件中不同环境的差异配置放在对应Profile文件中。容器重启配置通过.env文件加载的配置容器重启后仍会生效只要.env文件不修改无需重新传参。日志排查若配置未生效可通过docker logs 容器名查看应用启动日志确认环境变量是否成功读取。收藏本文后续部署多环境时直接对照步骤操作少走弯路六、结尾总结本文从环境变量的基础用法入手手把手教大家用-e参数临时传参、.env文件统一管理配置最终实现“一份镜像多环境运行”核心是通过Profile配置区分环境避免配置硬编码和镜像重复构建。无论是新手还是有经验的开发者掌握这套环境变量与配置管理方案都能大幅提升部署效率降低敏感配置泄露风险尤其适合后端项目的多环境部署场景。