Я пытаюсь запустить приложение java8, используя весеннюю загрузку версии 2.2.4. Затем приложение упаковывается в изображение docker.
Способ запуска моего приложения, как указано в Dockerfile, который заканчивается следующим образом:
FROM openjdk:8
.....
CMD /usr/local/openjdk-8/bin/java -jar -Dspring.config.location=/opt/$APP/ /opt/$APP/$APP.jar
Проблема, с которой я сталкиваюсь, заключается в загрузке внешних файлов свойств. Например, у меня есть файл application.properties, похожий на этот, который упакован внутри JAR :
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=db1
application.queue.sqs.queue_name=somesqs
Кроме того, я также добавляю изображение docker с добавлением application.properties
файл находится по адресу /opt/myapp/
. Этот внешний файл похож на этот:
spring.data.mongodb.uri=mongodb://username:password@MONGO_URL:27017/db_name
application.queue.sqs.queue_name=another_sqs
Ожидаемое поведение : приложение будет загружать как новое местоположение another_sqs
, так и внешнее соединение mon go .
Тем не менее, Фактическое поведение : при чтении журналов я вижу, что t новый sqs url (т.е. another_sqs) загружен правильно, хотя новое значение для mon go соединение отбрасывается и поэтому использует локальный встроенный механизм mon go.
Я проконсультировался в следующем посте по stackoverflow, чтобы попытаться понять, что я испытываю:
Spring Boot и несколько внешних файлов конфигурации
Но для моего понимания, при использовании Spring 2.X и выше, -Dspring.config.location должен переопределять все остальные файлы свойств ,
Вот где я начал отладку:
TRY 1: я подключил в docker контейнер, cd в /opt/$APP/
, где оба app.jar
и application.properties
расположены, выполнили следующую команду java -jar app.jar
и альт - работает ! Соединение с внешним источником mon go установлено. Это может быть объяснено приоритетом файлов свойств весенней загрузки, как указано в документах .
TRY для Spring: прикрепите контейнер, cd в $HOME/
, выполните java -jar /opt/$APP/app.jar -Dspring.config.location=/opt/$APP/
- не подключиться к внешнему пн go, однако подключается к another_sqs
. Странная вещь - загружается только часть значений application.properties
? Разве Spring 1.X не работает, добавляя значение из нескольких файлов?
ПОПРОБОВАТЬ 3: Присоединить контейнер, cd к $HOME/
, выполнить java -jar /opt/$APP/app.jar -Dspring.config.location=file:/opt/$APP/applicartion.properties
- такое же поведение.
Попробуйте 4: отредактированный Dockerfile включает следующее выполнение:
CMD usr/local/openjdk-8/bin/java -jar -Dspring.config.location=classpath:/application.properties,file:/opt/$APP/application.properties /opt/$APP/$APP-$VER.jar
и снова работает . И another_sqs
, и внешний пн go загружаются правильно при «Попытке 4».
Поэтому у меня такой вопрос:
Почему я должен явно указывать classpath:/application.proeprties
? Разве -Dspring.config.location=/opt/$APP/
или -Dspring.config.location=file:/opt/$APP/application.properties
не должно быть достаточно?