Ошибка при создании экземпляра класса Spring Configuration из файла свойств при запуске в контейнере Docker

Я получаю NumberFormatException, когда я запускаю свое веб-приложение в контейнере Tomcat 8 Docker. Ошибка возникает, когда Spring пытается создать экземпляр класса MongoConfig, который внедряет @Values, взятые из файла свойств classpath. Свойства в файле свойств следующие:

mongodb.host=mongodb
mongodb.database=mydatabase
mongodb.port=27017
mongodb.username=myusername
mongodb.password=mypassword

В файле MongoConfig он падает с NumberFormatException, когда он достигает этой точки:

@Value("${mongodb.port}")
private int port;

В соответствии с ошибкой, он выбирает "tcp://172.17.0.2:27017" как вход, который он пытается вставить в порт, несмотря на тот факт, что файл свойств явно дает порт без каких-либо других вещей, таких как IP-адреса. Полученный IP-адрес соответствует назначенному контейнеру mongodb (отдельному контейнеру Docker, без излишеств, просто mongodb: последний с --name mongodb, который затем - связывается как mongodb:mongodb в запуске контейнера Tomcat. команда). Если вы подключитесь к работающему контейнеру Tomcat и посмотрите на /etc/hosts, вы увидите запись для mongodb, и она кажется достижимой из контейнера Tomcat.

Почему Spring собирает весь tcp-адрес, включая IP-адрес и порт, если ему присвоен отдельный порт в файле свойств? Как мне с этим бороться?

Обновление - ошибка: "Ошибка создания bean-компонента с именем com.mydomain.myproject.config.MongoConfig": Неудовлетворенная зависимость, выраженная через поле "порт": не удалось преобразовать значение типа [java.lang.String] в требуемый тип [int]; вложенным исключением является java.lang.NumberFormatException: для входной строки: "tcp://172.17.0.2:27017"; вложенным исключением является org.springframework.beans.TypeMismatchException: не удалось преобразовать значение типа [java.lang.String. ] к требуемому типу [int]; вложенным исключением является java.lang.NumberFormatException: для входной строки: "tcp://172.17.0.2:27017""

Кажется, что mongodb.port переопределяется внутри контейнера. Изменение номера порта на 99999 ничего не сделало. Изменение имени свойства на "mylovely.port" затем дало нам ошибку с жалобой на то, что порт вышел за пределы допустимого диапазона, и показало, что оно равно 99999. После внесения изменений в 27017 я получил запущенное веб-приложение, без сбоев. Остается вопрос: что переопределяет это значение и почему свойство с именем port имеет полный адрес? Не в том ли, что опция --link не только устанавливает запись в /etc/hosts контейнера tomcat, но также создает некоторую глобальную переменную или свойство, называемое mongodb, которое независимо от того, что происходит после того, как оно всегда возвращает полный адрес?

1 ответ

Решение

Docker устанавливает переменную окружения MONGODB_PORT это имеет приоритет над файлом конфигурации. Вы можете доказать это, проверив (docker inspect) контейнер или, если он не будет работать, с помощью docker exec и выполнение env Команда внутри контейнера.

ОБНОВЛЕНО: как решить? Сначала прочитайте о PropertySource абстракция. Далее вы узнаете, что значение переменной среды может быть переопределено системным свойством (-Dmongodb.port=27017). Также я бы попробовал использовать PropertyOverrideConfigurer но я не уверен, что это сработает, подумал.

Другие вопросы по тегам