Bluemix Docker容器部署导致“无路由到主机”

我们正在使用这个命令部署docker-image:

cf ic run -p 8080 -m 512 -e SPRING_PROFILES_ACTIVE=test -e logging.config=classpath:logback-docker-test.xml --name <container-name> registry.eu-gb.bluemix.net/<repository_name>/<container-name>:latest 

在那个容器中,我们开始使用连接池提供程序的Java8 Spring-Boot应用程序。 连接池提供程序连接到可在标准端口上访问的现有PostgreSQL数据库。 我们不使用任何域名连接到PostgreSQL数据库。 我们只使用IP地址和标准的postgresql端口。

部署工作在使用标准Docker容器守护进程的机器上,同时也在Amazon WebServices(AWS)上工作,没有任何问题,并使用相同的部署机制。

但是,如果我们将映像部署到Bluemix-Container-Service,则在启动Spring引导应用程序时会出现以下错误:

 Caused by: java.net.NoRouteToHostException: No route to host at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at org.postgresql.core.PGStream.<init>(PGStream.java:61) at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:129) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:65) at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:146) at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:35) at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22) at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:47) at org.postgresql.jdbc42.AbstractJdbc42Connection.<init>(AbstractJdbc42Connection.java:21) at org.postgresql.jdbc42.Jdbc42Connection.<init>(Jdbc42Connection.java:28) at org.postgresql.Driver.makeConnection(Driver.java:415) at org.postgresql.Driver.access$100(Driver.java:47) at org.postgresql.Driver$ConnectThread.run(Driver.java:325) ... 1 more 

我们不知道为什么会发生这种情况,因为如果我们在另一台Bluemix-Docker-Machine上使用telnet连接到具有所需端口的PostgreSQL-Database服务器,一切都很好。

这非常烦人,因为我们目前无法在Bluemix上使用这个Docker-Image,而且目前正在阻碍我们的计划推出。

你能帮我们详细介绍一下可能是错的吗?怎样才能解决这个问题?

任何帮助将不胜感激。

问候,

基督教

容器启动时是否出现此错误? 如果是这样,Bluemix上的Docker / IBM Containers在联网状态下需要大约30到60秒:在此阶段,容器无法连接到networking。 这应该很可能是错误的根源:如果Java SpringBoot应用程序在容器处于联网阶段时尝试连接到PostgreSQL数据库,它将失败,并出现此错误。 当容器完成联网阶段时(例如,通过检查PostgreSQL服务器可用性的bash脚本,或者简单地configuration你的springboot来pipe理这个exception),你应该开始在容器上运行应用程序。

在启动需要networking访问的Java应用程序之前,官方的bluemix支持提示等待120秒。 build议的方法是:

 CMD ["/bin/sh", "-c", "sleep 120; exec java $JVM_ARGS -cp /app org.springframework.boot.loader.JarLauncher --spring.main.show_banner=false"] 

随着我们有networking访问,一切都很好。