#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-адресом.
Это разрешилось в моем сценарии.