ОШИБКА :загрузочный контейнер docker Spring : java.lang.Исключение IllegalArgumentException: Не удалось разрешить заполнитель ‘CASSANDRA_HOST’ в значении «${CASSANDRA_HOST}»

#java #spring-boot #docker #docker-compose #cassandra-3.0

Вопрос:

Я запускаю приложение spring boot внутри контейнера docker, и оно связано с другим контейнером Кассандры с сетью docker (мостом привода). Проблема в том, что я использую переменную среды linux, вызываемую CASSANDRA_HOST для сохранения IP-адреса контейнера Cassandra и загрузки spring could not resolve placeholder 'CASSANDRA_HOST' in value "${CASSANDRA_HOST}" .

Переменная среды была создана нормально в контейнере Spring Boot. И я протестировал другую переменную среды, и некоторые из них работают, а другие не работают. Итак, я не понимаю, в чем ошибка.

ошибка:

 Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'CASSANDRA_HOST' in value "${CASSANDRA_HOST}"  at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:178)  at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124)  at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239)  at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210)  at org.springframework.core.env.AbstractPropertyResolver.resolveNestedPlaceholders(AbstractPropertyResolver.java:230)  at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:88)  at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:62)  at org.springframework.core.env.AbstractEnvironment.getProperty(AbstractEnvironment.java:535)  at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$1.getProperty(PropertySourcesPlaceholderConfigurer.java:137)  at org.springframework.context.support.PropertySourcesPlaceholderConfigurer$1.getProperty(PropertySourcesPlaceholderConfigurer.java:133)  at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:85)  at org.springframework.core.env.PropertySourcesPropertyResolver.getPropertyAsRawString(PropertySourcesPropertyResolver.java:74)  at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:151)  at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124)  at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239)  at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210)  at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.lambda$processProperties$0(PropertySourcesPlaceholderConfigurer.java:175)  at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:936)  at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1321)  at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)  at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)  at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)  at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)  ... 59 more  

В application.properties я задаю переменную, как показано ниже:

 cassandra.contactpoints= ${CASSANDRA_HOST}  

В классе CassandraCoonfig я установил значение@, чтобы прочитать IP-адрес:

 @Configuration  public class CassandraConfig extends AbstractCassandraConfiguration {   @Value("${cassandra.contactpoints}")   private String contactPoints;  

В POM.XML, я использую тег lt; filtering gt; :

 lt;resourcesgt;  lt;resourcegt;  lt;directorygt;src/main/resourceslt;/directorygt;  lt;filteringgt;truelt;/filteringgt;  lt;/resourcegt; lt;/resourcesgt;  

ИЗМЕНИТЬ: Это печать всех переменных среды в контейнере spring. CASSANDRA_HOST находится там, в строке 14.

введите описание изображения здесь

Комментарии:

1. вы определили переменную среды в контейнере docker, в котором вы запускаете приложение spring boot?

2. да, я знаю. Я устанавливаю в загрузочный контейнер spring и в docker-compose.yml пишу тег среды: environment: - CASSANDRA_HOST=${CASSANDRA_HOST} . У вас есть какие-нибудь идеи?

3. Можете ли вы запустить bash внутри контейнера, а затем распечатать переменные среды? Я думаю, это поможет устранить один потенциальный источник проблемы. Это просто поможет подтвердить, действительно ли установлен параметр env или нет.

4. Хорошо, я отредактировал вопрос и добавил печать. Как вы можете видеть, CASSANDRA_HOST находится там. Это так странно.

Ответ №1:

Я решил эту проблему, построив мост docker-compose.yml с помощью команды ниже:

 networks:  net:  driver: "bridge"  

Это полное docker-compose.yml :

 version: '3'  services:  ... (your code)  networks:   - net  networks:  net:  driver: "bridge"  

С помощью этой сети в образе докера, в контейнере, вы проверяете сеть и находите нужный вам IP-адрес. Затем вы устанавливаете переменную среды с этим IP-адресом.

Это разрешилось в моем сценарии.