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

Java 微服务在Eureka上注册Docker内部IP而不是公共IP,java,docker,spring-cloud,netflix-eureka,Java,Docker,Spring Cloud,Netflix Eureka,我想在Eureka上注册一些微服务。它们部署在远程机器上,我希望能够在Eureka上看到机器的IP,但我只能看到像172.17.0.8这样的私有IP,无法从外部访问 由于这些微服务是在Docker容器上运行的,我知道我需要告诉服务获取主机的IP而不是Docker的IP,但我真的不知道怎么做 我在github上看到了这个问题-> 并尝试: eureka.instance.prefer-ip-address=true eureka.instance.ip-address= 这不太管用。有没有一种方

我想在Eureka上注册一些微服务。它们部署在远程机器上,我希望能够在Eureka上看到机器的IP,但我只能看到像
172.17.0.8
这样的私有IP,无法从外部访问

由于这些微服务是在Docker容器上运行的,我知道我需要告诉服务获取主机的IP而不是Docker的IP,但我真的不知道怎么做

我在github上看到了这个问题->

并尝试:

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

这不太管用。有没有一种方法不涉及向我的服务添加代码或使用AWS的API

解决方案是使用一个小脚本将公共IP注入Docker容器中:

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'
主要问题是从脚本中导出变量,因为我们使用的是
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>

com.googlecode.maven-download-plugin
下载maven插件
1.3.0
过程资源
wget
https://url/entrypoint.sh
${project.build.directory}/docker

我在我的环境中也遇到了同样的问题-它是用eureka上的容器ID而不是主机名注册的。但这不在AWS上,因此无法为公共ip调用API。下面的命令解决了我的问题-

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

您需要进一步了解该问题。特别是对于aws,您可以从
http://169.254.169.254/latest/meta-data/public-ipv4
,如果您有spring aws:您可以注入
@Value(“${public-ipv4}”)
,或者使用这里提到的其他方法。基本上,他们最终都会使用这个url。如果您不希望它出现在代码中,请在其外部某处进行检查,并使用属性将其放入代码中(并读取这些环境变量)。您可以尝试在环境变量
eureka.instance.hostname
中设置主机名。但是,如果您在aws云上运行,并且您的实例是短暂的,那么您必须使用实例元数据来填充环境变量。我已经看到了类似这样的内容:
hostname:${DOCKER\u HOST:localhost}
,尽管我还没有尝试过。这就是你所说的@Shibashis吗?这取决于你是否在主机上设置了DOCKER_主机。我建议在docker Startup中添加一个环境变量还有另一个选项: