的解决方案是使用一个小的脚本注入多克尔容器内的公网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>
你需要在这个问题上看得更远。特别是对于aws,你可以从'http:// 169.254.169.254/latest/meta-data/public-ipv4'获得你的主机的ip,以防万一你有春天的麻烦:你可以注入'@Value(“$ {public- ipv4}“)',或者使用那里提到的其他方法。基本上所有人都最终使用该网址。如果您不想在代码中使用它,请在其外部进行检查并使用属性将其带入代码中(https://github.com/spring-cloud/spring-cloud-netflix/issues/432#issuecomment -134512416并阅读这些环境变量) – zapl
您可以尝试设置环境变量'eureka.instance.hostname'中的主机名。但是如果你在aws云上运行并且你的实例是短暂的,你将不得不使用实例元数据来填充环境变量 – Shibashis
我已经看到诸如'hostname:$ {DOCKER_HOST:localhost}'之类的东西,尽管我没有尝试过呢。那是你的意思@Shibashis? –