Spring boot Spring boot 2.4.2 external application.yml未在Docker容器中读取

Spring boot Spring boot 2.4.2 external application.yml未在Docker容器中读取,spring-boot,Spring Boot,Spring Boot:2.4.2-云版本:2020.0.0-Java 15-来自nginx的Docker:1.19.6-alpine 我的外部应用程序.yml位于Docker容器中的spring启动jar旁边。这是为了覆盖某些属性 springboot.jar application.yml 我有一个bash脚本作为启动jar的入口点 exec env LOG_FILE=/logs/$APP_NAME/$APP_NAME.LOG java$opts-jar/opt/APP/APP.jar&

Spring Boot:2.4.2-云版本:2020.0.0-Java 15-来自nginx的Docker:1.19.6-alpine

我的外部
应用程序.yml
位于Docker容器中的spring启动jar旁边。这是为了覆盖某些属性

springboot.jar
application.yml
我有一个bash脚本作为启动jar的入口点

exec env LOG_FILE=/logs/$APP_NAME/$APP_NAME.LOG java$opts-jar/opt/APP/APP.jar&
问题是当Docker启动这个容器时,
springboot.jar
没有读取外部应用程序.yml

请注意,应用程序启动时没有任何问题。只是没有读取我想要覆盖的属性

一个非常简单的例子是,在
应用程序.yml
中,我故意设置

logging:
  level:
    root: DEBUG
现在,我的期望是看到所有调试日志。应用程序没有阅读它

但是,如果我登录到容器并杀死java进程,然后自己用上面提到的相同脚本重新启动它,它会在
应用程序.yml
中拾取值

唯一有效的解决方案是使用

-Dspring.config.import=file:/opt/app/application.yml
这是与2.4.2相关的问题还是我在这里遗漏了什么?

由于Spring Boot查找应用程序属性的顺序是:

  • 类路径根
  • classpath/config包
  • 当前目录
  • 当前目录中的/config子目录
  • /config子目录的直接子目录
  • 较高定义的特性将覆盖较低定义的特性

    因此:如果您通过
    java$opts-jar/opt/app/app.jar
    (您使用绝对jar路径调用它),请确保您在这个目录中(
    cd/opt/app

    示例

    假设您具有以下目录/文件结构:

    .
    ├── foo
    │   └── bin
    │       ├── app.jar
    │       |   └── application.yml
    │       └── application.yml
    
    同样给出:在
    app.jar
    应用程序中.yml
    spring.jpa.show sql
    设置为
    false
    ,在
    bin
    目录下的
    application.yml
    中设置为
    true

    bin
    文件夹内执行:

    在这种情况下,应用程序运行时将
    spring.jpa.show sql
    设置为
    true
    ,因为找到了当前目录的
    application.yml
    ,并且覆盖了
    app.jar
    application.yml
    中定义的属性

    在另一个目录中执行

    在这种情况下,应用程序运行时将
    spring.jpa.show sql
    设置为
    false
    ,因为在当前目录中(bin上的目录)没有
    application.yml
    ,因此使用
    app.jar
    application.yml

    由于Spring Boot查找应用程序属性的顺序:

  • 类路径根
  • classpath/config包
  • 当前目录
  • 当前目录中的/config子目录
  • /config子目录的直接子目录
  • 较高定义的特性将覆盖较低定义的特性

    因此:如果您通过
    java$opts-jar/opt/app/app.jar
    (您使用绝对jar路径调用它),请确保您在这个目录中(
    cd/opt/app

    示例

    假设您具有以下目录/文件结构:

    .
    ├── foo
    │   └── bin
    │       ├── app.jar
    │       |   └── application.yml
    │       └── application.yml
    
    同样给出:在
    app.jar
    应用程序中.yml
    spring.jpa.show sql
    设置为
    false
    ,在
    bin
    目录下的
    application.yml
    中设置为
    true

    bin
    文件夹内执行:

    在这种情况下,应用程序运行时将
    spring.jpa.show sql
    设置为
    true
    ,因为找到了当前目录的
    application.yml
    ,并且覆盖了
    app.jar
    application.yml
    中定义的属性

    在另一个目录中执行

    在这种情况下,应用程序运行时将
    spring.jpa.show sql
    设置为
    false
    ,因为在当前目录(bin上的目录)中没有
    application.yml
    ,因此使用
    app.jar
    application.yml

    cd bin
    cd ..
    java -jar bin/app.jar