2016-05-31 2 views
1

Я пытаюсь зарегистрировать некоторые микросервисы на Eureka. Они развернуты на удаленных машинах, и я ожидал увидеть IP-адрес машины на Eureka, но все, что я вижу, - это частный IP-адрес, например 172.17.0.8, который недоступен извне.Микросервисы, регистрирующие внутренний IP-адрес Docker на Eureka, а не публичный

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

Я видел этот вопрос на GitHub ->https://github.com/spring-cloud/spring-cloud-netflix/issues/432

и попробовал:

eureka.instance.prefer-ip-address=true 
eureka.instance.ip-address= 

Это весьма не работает. Есть ли способ сделать это, не связанный с добавлением кода в мою службу или с использованием API AWS?

+0

Вам необходимо подробнее рассмотреть эту проблему. Для aws специально вы можете получить IP-адрес своего хоста от 'http: // 169.254.169.254/latest/meta-data/public-ipv4', если у вас весна aws: вы можете ввести' @Value ("$ {public- ipv4} ")' или использовать другие упомянутые там подходы. В основном все они используют этот URL-адрес в конце. Если вы не хотите его в коде, сделайте чек вне его где-нибудь и используйте свойства, чтобы привести его в код (https://github.com/spring-cloud/spring-cloud-netflix/issues/432#issuecomment -134512416 и прочитать эти окружения) – zapl

+0

Вы можете попробовать установить имя хоста в переменной среды 'eureka.instance.hostname'. Но если вы работаете с облаком aws и ваши экземпляры являются эфемерными, вам придется использовать метаданные экземпляра для заполнения переменной окружения – Shibashis

+0

Я видел такие вещи, как: 'hostname: $ {DOCKER_HOST: localhost}', хотя у меня нет попробовал еще. Это то, что вы имеете в виду @Shibashis? –

ответ

1

Решение было впрыснуть публичный IP внутри контейнера Докер с помощью небольшого скрипта:

entrypoint.sh

export DOCKER_HOST_IP=$(curl --retry 3 --connect-timeout 2 --max-time 2 -s 169.254.169.254/latest/meta-data/public-ipv4) 

echo $DOCKER_HOST_IP > /var/log/dockerIp.log 

exec "[email protected]" 

Затем модифицирования Dockerfile, чтобы запустить его в начале:

FROM java:8 
VOLUME /tmp 
EXPOSE 9000 
ADD service-1.0-SNAPSHOT.jar app.jar 
RUN bash -c 'touch /app.jar' 

COPY entrypoint.sh /usr/local/bin/entrypoint.sh 
RUN chmod +x /usr/local/bin/entrypoint.sh 

CMD bash -c 'source /usr/local/bin/entrypoint.sh && java -Djava.security.egd=file:/dev/./urandom -jar /app.jar' 

Основная проблема заключалась в том, чтобы экспортировать переменную сценария, для этого мы используем source, который доступен только в bash, вот почему CMD.

Этот сценарий может быть вручную помещен в рамках проекта, хотя мы настроили его как автоматическую загрузку ресурсов в нашем Maven сборки:

  <plugin> 
       <groupId>com.googlecode.maven-download-plugin</groupId> 
       <artifactId>download-maven-plugin</artifactId> 
       <version>1.3.0</version> 
       <executions> 
        <execution> 
         <phase>process-resources</phase> 
         <goals> 
          <goal>wget</goal> 
         </goals> 
         <configuration> 
          <url>https://url/entrypoint.sh</url> 
          <outputDirectory>${project.build.directory}/docker</outputDirectory> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
+0

Существует еще одна опция: https://github.com/spring-cloud/spring-cloud-netflix/issues/432#issuecomment-135327850 –

0

я такой же вопрос на моем environments- он регистрирующий с контейнерной ID на eureka вместо имени хоста. Но это не на AWS, поэтому не может вызвать API для публичного ip. Ниже была решена моя проблема.

sudo docker run -i --net=host <dockerregistry_host>/<appName>:tag