java容器化部署中,.env文件专供docker compose解析并注入容器环境变量,不被spring boot直接读取;需通过environment块或env_file显式传递变量,并按环境拆分配置文件、配合--env-file切换,同时做好.gitignore忽略、.env.example模板和启动校验。

Java 容器化部署中,用 .env 文件管理多环境配置,核心是把敏感信息和可变参数从镜像中剥离,靠运行时注入,既安全又灵活。关键不在“有没有 .env”,而在于怎么分层、怎么加载、怎么不冲突。
区分用途:.env 是给 Docker Compose 用的,不是给 Spring Boot 直接读的
Docker Compose 默认加载项目根目录下的 .env,它只影响 docker-compose.yml 里的变量替换(比如 ${DB_PORT}),不影响 Java 应用内部。Spring Boot 要读环境变量,得靠 JVM 启动或系统级注入——所以 .env 的作用是“喂给 Compose”,再由 Compose 把变量传进容器环境,最终被 Java 进程继承。
-
.env文件定义的是构建/编排时的参数,例如服务端口、镜像标签、数据库地址前缀 - 真正传给 Spring Boot 的,是
environment:块里显式声明的变量,或通过env_file:挂载的文件 - 推荐做法:用
.env控制部署行为(如COMPOSE_PROJECT_NAME),用单独的app.env或env_file传业务配置
按环境拆分 env 文件,配合 --env-file 切换
不要只靠一个 .env,为 dev/test/prod 分别建文件,启动时指定:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
.env.development:含APP_DEBUG=true、LOG_LEVEL=debug、本地 DB 地址 -
.env.production:含APP_DEBUG=false、LOG_LEVEL=warn、RDS 连接串、密钥占位符 - 启动命令:
docker-compose --env-file .env.production up -d - Spring Boot 自动识别这些变量(如
spring.datasource.url绑定到SPRING_DATASOURCE_URL)
在 docker-compose.yml 中桥接变量,避免硬编码
把 .env 里的值转成容器环境变量,同时兼容 Spring Boot 的命名规范:
- 用
environment:显式映射:- SPRING_DATASOURCE_URL=jdbc:postgresql://${DB_HOST}:${DB_PORT}/mydb - 或直接挂载 env 文件:
env_file: ./envs/.env.${ENVIRONMENT}(需配合--env-file .env提前设好ENVIRONMENT=production) - 推荐组合:
.env定义ENVIRONMENT=prod,再用env_file: .env.${ENVIRONMENT}动态加载
安全与协作:忽略、模板、校验三件套
防止密钥泄露和配置缺失,必须做三件事:
- 把所有
.env.*加入.gitignore,绝不提交到代码库 - 提供
.env.example作为模板,标注必填项(如# REQUIRED: DB_PASSWORD=) - 在 Spring Boot 启动类加校验逻辑:
if (StringUtils.isEmpty(System.getenv("DB_PASSWORD"))) { throw new IllegalStateException("Missing DB_PASSWORD"); }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










