通过环境变量覆盖 Spring Boot yaml 属性

Posted

技术标签:

【中文标题】通过环境变量覆盖 Spring Boot yaml 属性【英文标题】:Override Spring Boot yaml property via environment variable 【发布时间】:2022-01-12 23:25:38 【问题描述】:

使用 Spring Boot 2.6.1,如果我有一个 application.properties 文件,看起来像:

spring.datasource.url="jdbc://blahblah"

我可以在运行时使用名为 spring.datasource.url 的环境变量覆盖该值,我的应用程序将连接到 env var 中指定的数据库。

但是,如果我有一个等效的 application.yaml 文件,那么以这种方式指定环境变量似乎没有效果。

spring:
  datasource:
    url: "jdbc://localhost..."

但是,如果我将环境变量重命名为 SPRING_DATASOURCE_URL,覆盖将再次起作用。这似乎在其他属性中也是一致的(不仅仅是数据源 url)。

查看the docs 并不清楚为什么会出现这种情况,只是 yaml 配置似乎通常与“普通”属性文件略有不同。

这是预期的行为吗?

【问题讨论】:

【参考方案1】:

作为described in the documentation,你应该使用环境变量SPRING_DATASOURCE_URL来设置spring.datasource.url属性。我很惊讶spring.datasource.url 在配置为环境变量时完全有效,我不会依赖它继续这样做。

【讨论】:

老实说,我也是,但在另一个项目中看到了它,我的想法是“嘿,现在 env vars 与属性名称完全匹配!”哦,好吧...大写是:)

以上是关于通过环境变量覆盖 Spring Boot yaml 属性的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot基础3-配置文件详解:Properties和YAML

Spring Boot application.yaml中多个默认环境变量的语法

无法覆盖 Spring Boot 应用程序的 Hazelcast.yaml 中的属性

Spring boot- Spring Boot特性2

Spring Boot 配置的优先级

Spring Boot 2.0 教程 - 配置详解