在Eureka上注册Docker内部IP的微服务而不是公共的

我试图在Eureka上注册一些微服务。 他们部署在远程机器上,我希望能够在Eureka上看到机器的IP,但我所能看到的是一个私有IP,如172.17.0.8 ,这是不能从外部访问的。

由于这些微服务运行在Docker容器上,所以我知道我需要告诉服务器来取代主机的IP,而不是Docker的,但我真的不知道如何。

我在github上看到了这个问题 – > https://github.com/spring-cloud/spring-cloud-netflix/issues/432

并尝试:

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

这不太合适。 有没有办法做到这一点,不涉及到我的服务或使用AWS的API添加代码?

解决scheme是使用一个小脚本在Docker容器内注入公共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 "$@" 

然后修改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' 

主要的问题是从脚本中导出variables,因为我们使用的source只能在bash ,这就是CMD的原因。

这个脚本可以手动放置在项目中,尽pipe我们在我们的maven版本中将其configuration为自动资源下载:

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

在我的环境中,我遇到了同样的问题 – 它使用eureka上的容器标识注册,而不是主机名。 但是,这不是在AWS上,所以不能调用公共IP的API。 下面的命令解决我的问题 –

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