Bluemix Docker Container部署导致"没有到主机的路由"

时间:2016-04-07 15:15:52

标签: spring postgresql docker containers ibm-cloud

我们正在使用此命令部署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-Database。我们只使用IP地址和标准的postgresql端口。

部署正在使用标准Docker容器守护程序的计算机上运行,​​并且还在没有任何问题和使用相同部署机制的情况下在Amazon WebServices(AWS)上工作。

但是,如果我们将映像部署到Bluemix-Container-Service,我们会在启动spring-boot应用程序时遇到以下错误:

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上使用所需端口对PostgreSQL-Database服务器进行telnet,一切都很好。

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

您能帮我们详细解释可能出现的问题吗?如何解决这个问题?

任何帮助将不胜感激。

此致

基督教

2 个答案:

答案 0 :(得分:1)

容器启动时是否出现此错误? 如果是这样,Bluemix上的Docker / IBM Containers在网络状态下大约需要30到60秒:在此阶段,容器无法连接到网络。 它应该可能是您获得的错误的根本原因:如果Java SpringBoot应用程序在容器仍处于网络阶段时尝试连接到PostgreSQL数据库,则它将因此错误而失败。 当容器完成网络阶段时,您应该在容器上运行应用程序(例如,通过检查PostgreSQL服务器可用性的bash脚本,或者只是配置springboot来管理此异常)

答案 1 :(得分:1)

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

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

有了这个我们有网络访问,一切都很好。