2016-05-31 9 views
1

Ich versuche, einige Microservices auf Eureka registrieren. Sie werden auf entfernten Rechnern eingesetzt und ich erwarte, dass ich die IP des Rechners auf Eureka sehen kann, aber alles, was ich sehen kann, ist eine private IP wie 172.17.0.8, die von außen nicht zugänglich ist.Microservices Registrierung Docker interne IP auf Eureka anstelle von öffentlichen

Da diese Microservices auf Docker-Containern laufen, verstehe ich, dass ich dem Dienst sagen muss, dass er die IP des Hosts anstelle von Docker aufnimmt, aber ich sehe nicht wirklich, wie.

sah ich dieses Problem auf Github ->https://github.com/spring-cloud/spring-cloud-netflix/issues/432

und versuchte:

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

Es funktioniert nicht ganz. Gibt es eine Möglichkeit, dies zu tun, ohne Code zu meinem Service hinzuzufügen oder die API von AWS zu verwenden?

+0

Sie müssen weiter unten in diesem Problem suchen. Für aws können Sie die IP-Adresse Ihres Hosts von "http: // 169.254.169.254/latest/meta-data/public-ipv4" beziehen, falls Sie eine Spring-aws haben: Sie können '@Value ($ {public- ipv4} ")', oder verwenden Sie die anderen dort genannten Ansätze. Im Grunde verwenden alle diese URL am Ende. Wenn Sie es nicht in Code möchten, tun Sie die Überprüfung außerhalb von irgendwo und verwenden Sie Eigenschaften, um es in den Code zu bringen (https://github.com/spring-cloud/spring-cloud-netflix/issues/432#issuecomment -134512416 und lesen Sie diese Umgebung vars) – zapl

+0

Sie können versuchen, den Hostnamen in der Umgebungsvariable 'eureka.instance.hostname' zu ​​setzen. Aber wenn Sie auf der aws cloud laufen und Ihre Instanzen kurzlebig sind, müssen Sie Instanz-Metadaten verwenden, um die Umgebungsvariable – Shibashis

+0

zu füllen. Ich habe Dinge gesehen wie: 'hostname: $ {DOCKER_HOST: localhost}', obwohl ich nicht habe es noch probiert. Meinst du das @Shibashis? –

Antwort

1

Die Lösung war die öffentliche IP innerhalb des Docker Behälters mit einem kleinen Skript zu injizieren:

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]" 

Dann Dockerfile Modifizieren es am Anfang zu laufen:

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' 

Das Hauptproblem bestand darin, die Variable zu exportieren des Skripts, für das wir source verwenden, das nur in bash verfügbar ist, das ist der Grund des CMD.

Dieses Skript kann manuell innerhalb des Projekts gesetzt werden, auch wenn wir es als automatische Ressource Download in unserem Maven Build konfiguriert:

  <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

Es gibt eine andere Option: https://github.com/spring-cloud/spring-cloud-netflix/issues/432#issuecomment-135327850 –

0

hatte ich gleiche Problem auf meinem environments- es auf mit Container ID wurde Registrierung Eureka anstelle des Hostnamens. Aber das ist nicht auf AWS so konnte nicht die API für öffentliche IP aufrufen. Unterhalb des Befehls gelöst mein Problem -

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