spring boot 应用在 docker 中动态读取环境变量的核心是主动识别与解析,通过 @value 或 @configurationproperties 绑定,支持多种命名格式;配合 docker run -e、docker-compose environment 或 env_file 传入变量,并依优先级(命令行 > 系统属性 > 环境变量 > 配置文件)生效。

Java 应用在 Docker 容器中动态读取环境变量,核心不是“自动注入”,而是让应用主动识别、解析并使用这些变量。Spring Boot 等主流框架已内置支持机制,关键在于配置方式与容器传参的配合。
Spring Boot 通过 @Value 或 @ConfigurationProperties 绑定环境变量
Spring Boot 默认将系统环境变量(如 DB_HOST)和 JVM 系统属性(如 -Dserver.port=8081)自动映射为配置项,无需额外代码即可绑定。
- 用 @Value("${db.host:localhost}") 直接注入,冒号后是默认值
- 用 @ConfigurationProperties(prefix = "app") 批量绑定,例如环境变量 APP_TIMEOUT=5000 对应
app.timeout - 变量名支持驼峰、下划线、点分隔等多种格式:APP_LOG_LEVEL、app.log-level、app-log-level 都能匹配
app.log-level
启动时指定 profile 和外部配置位置
环境变量可驱动 Spring Boot 加载不同配置,实现真正的“一套代码、多套环境”。
- 设 SPRING_PROFILES_ACTIVE=prod → 自动加载
application-prod.yml - 设 SPRING_CONFIG_LOCATION=file:/config/ → 优先从挂载目录读取配置文件(如
/config/application.yml) - 设 SPRING_CONFIG_ADDITIONAL_LOCATION=classpath:/shared/ → 补充加载类路径下的共享配置
Docker 容器内正确传入变量的三种常用方式
变量必须真正进入容器内部,且被 Java 进程可见,才算“生效”。常见组合如下:
- docker run -e DB_HOST=10.10.1.20 -e SPRING_PROFILES_ACTIVE=staging my-java-app
- docker-compose.yml 中 environment 字段 + .env 文件预设:.env 提供默认值,Shell 启动时变量可覆盖它
- env_file 指向敏感变量文件(如 prod.env),再配合 environment 显式暴露关键键名:既安全又可控
Java 代码里获取变量的优先级与实操建议
同一配置项可能来自多个来源,Spring Boot 有明确优先级(从高到低):命令行参数 > 系统属性 > 环境变量 > jar 包内配置文件。实际开发中推荐:
- 非敏感参数(如 server.port、logging.level)直接用环境变量传入,简洁高效
- 敏感参数(如 DB_PASSWORD)避免写进 docker-compose.yml,改用 env_file 或 Kubernetes Secret 挂载
- 在代码中用 System.getenv("XXX") 做兜底或调试,但生产环境优先走 Spring 的自动绑定机制
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











