Spring boot 2.4.2 внешнее приложение.yml не считывается в контейнере Docker

#spring-boot

#пружинный ботинок

Вопрос:

Весенняя загрузка: 2.4.2 — Облачная версия: 2020.0.0 — Java 15 — Docker ИЗ nginx: 1.19.6-alpine

У меня есть мой внешний application.yml файл рядом с моей spring boot jar в контейнере Docker. Это делается для переопределения некоторых свойств.

 springboot.jar
application.yml
 

У меня есть скрипт bash в качестве точки входа, который запускает jar

 exec env LOG_FILE=/logs/$APP_NAME/$APP_NAME.log java $opts -jar /opt/app/app.jar amp;
 

Проблема в том, что когда Docker запускает этот контейнер, springboot.jar он не читает внешнее application.yml.

Обратите внимание, что приложение запускается без каких-либо проблем. Он просто не читает свойства, которые я хочу переопределить.

Очень простой пример заключается в том, что в application.yml Я намеренно установил

 logging:
  level:
    root: DEBUG
 

Теперь я ожидал увидеть все журналы отладки. Приложение не прочитало его.

НО, если я войду в контейнер, завершу java-процесс и перезапущу его сам с помощью того же скрипта, упомянутого выше, он получает значения в application.yml .

Единственным работающим решением было запустить его с помощью

 -Dspring.config.import=file:/opt/app/application.yml
 

Это проблема, связанная с 2.4.2, или я что-то здесь упускаю?

Ответ №1:

Из-за особенностей Spring Boot раздел 2.3 Внешние свойства приложения порядок поиска свойств приложения Spring Boot:

  1. Корневой путь к классу
  2. Пакет classpath / config
  3. Текущий каталог
  4. Подкаталог /config в текущем каталоге
  5. Непосредственные дочерние каталоги подкаталога /config

Более высокие определенные свойства переопределяют более низкие определенные свойства.

Итак: если вы запускаете его через java $opts -jar /opt/app/app.jar (вы вызываете его с абсолютным путем к jar), убедитесь, что вы находитесь в этом каталоге ( cd /opt/app ).

Пример

Допустим, у вас есть следующая структура каталогов / файлов:

 .
├── foo
│   └── bin
│       ├── app.jar
│       |   └── application.yml
│       └── application.yml
 

Также указано: В app.jar ‘s application.yml spring.jpa.show-sql установлено значение false , а в application.yml каталоге under the bin — установлено значение true .

Выполнение внутри bin папки:

 cd bin
java -jar app.jar
 

В этом случае приложение запускается с spring.jpa.show-sql установленным значением true , потому application.yml что найден текущий каталог и свойство, определенное в application.yml of app.jar , перезаписывается.

Выполнение в другом каталоге

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

В этом случае приложение запускается с spring.jpa.show-sql установленным значением false , потому что в текущем каталоге (каталоге ВЫШЕ bin ) его нет application.yml , и поэтому application.yml app.jar используется значение .