Docker Compose配置的自定义环境变量在Spring Boot Kotlin项目中不生效
问题原因与解决方案
核心原因
Spring Boot默认宽松绑定规则 + 环境变量命名规范的双重限制:
- 你配置的
spring_datasource_username符合Spring Boot的环境变量映射规则:Spring会自动将环境变量的下划线_转换为配置属性的点.,所以该变量会被自动映射为Spring Boot内置的spring.datasource.username数据源属性,因此可以正常读取。 - 自定义变量
my-app_env_one包含短横线-,不符合Spring Boot默认的宽松绑定映射逻辑,无法自动映射到代码中的配置属性;同时POSIX标准中环境变量名不推荐使用短横线,部分场景下会导致JVM读取异常。
解决方案
方案1(推荐,符合Spring Boot规范)
修改docker-compose.yml中的环境变量命名,统一使用大写字母+下划线的格式:
environment: MY_APP_ENV_ONE: something spring_datasource_username: user
代码中直接按Spring Boot常规配置方式读取即可:
- 用
@Value注入:@Value("${my.app.env.one}") lateinit var envOne: String - 用
@ConfigurationProperties读取:前缀配置为my.app,定义属性envOne即可自动映射
方案2(保留原有变量名)
如果必须保留my-app_env_one的变量名,直接通过完整变量名读取即可:
@Value("${my-app_env_one}") lateinit var envOne: String- 或直接调用JDK原生方法读取:
System.getenv("my-app_env_one")
验证方法
可以先执行以下命令确认容器内的环境变量是否正常传递:docker exec tomcat printenv my-app_env_one
如果命令输出对应值,说明变量已经正常传入容器,仅为Spring Boot映射问题,按上述方案修改即可。
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

