Spring 在 docker 环境中启动外部配置:application.yml 不存在

Spring boot external config in a docker environment: application.yml does not exist

在开始解释我的问题之前,值得一提的是,虽然我正在尝试如何将 Maven Jib 插件与 Spring Boot 和 Kubernetes 结合使用,但即使我尝试使用,问题也是一样的正常 docker.

我已经使用 Kubernetes configMap 创建了 application.yml 文件并将其作为外部文件挂载到 Pod (/config/application.yml)。我一直面临的问题是我的应用程序无法找到 application.yml 文件并抛出一个典型的异常:

ERROR [main] org.springframework.boot.SpringApplication: Application run failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.example.Application]; nested exception is java.io.FileNotFoundException: class path resource [application.yml] cannot be opened because it does not exist

我通过使用不同的参数尝试了 Jib 的不同方法,如下所示。

  <container>
    <extraClasspath>/config/*</extraClasspath>
    <args>
      <arg>--spring.config.location=file:/config/application.yml</arg>
    </args>
    <jvmFlags>
      <jvmFlag>-Dspring.config.location=classpath:/,classpath:/config/,file:./,file:./config/,file:/config/</jvmFlag>
    </jvmFlags>
  </container>

None 其中对我有用。我也尝试过使用 SPRING_CONFIG_NAME 环境变量并将其设置为 file:/config/application.yml 用于 pod,但仍然是同样的问题。

我可以验证配置文件存在于指定位置并且没有权限问题(据我所知)。

有趣的是,当我在默认类路径 (src/main/resources) 中创建一个空的 application.yml 文件时,它通过了第一次验证并且应用程序成功加载(使用 [=21= 中的实际值) ]),因此无论问题是什么,它都会受到 Spring 引导的初始验证的影响,甚至在将应用程序文件传递给相应的 类.

之前

事实证明,我唯一需要的项目是:

<container>
    <extraClasspath>/config</extraClasspath> <!-- No need to have * at the end -->
</container>