#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:
- Корневой путь к классу
- Пакет 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
‘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
используется значение .