的解決方案是使用一個小的腳本注入多克爾容器內的公網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? –