2016-04-07 4 views
0

wir den Einsatz einer Docker-Bild mit diesem Befehl:Bluemix Docker Containerbereitstellungsergebnisse in "No route to host"

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 

In diesem Container wir eine Java8 Feder Boot-Anwendung starten, die eine connection- verwendet Pooling-Anbieter. Der Verbindungspooling-Provider stellt eine Verbindung zu einer vorhandenen PostgreSQL-Datenbank her, auf die über den Standardport zugegriffen werden kann. Wir verwenden keinen Domainnamen, um eine Verbindung zur PostgreSQL-Datenbank herzustellen. Wir verwenden nur die IP-Adresse und den Standard-Postgresql-Port.

Die Bereitstellung funktioniert auf einem Computer, der den standardmäßigen Docker-Container-Daemon verwendet und auch ohne Probleme mit Amazon WebServices (AWS) arbeitet und denselben Bereitstellungsmechanismus verwendet.

Wenn wir jedoch das Bild in dem Bluemix-Container-Dienst bereitstellen wir die folgenden Fehler der Feder-Boot-Anwendung beim Start erhalten tun:

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 

Wir wissen nicht, warum dies geschieht, denn wenn wir ein Telnet auf einer anderen Bluemix-Docker-Machine zum PostgreSQL-Database Server mit dem gewünschten Port machen, ist alles in Ordnung.

Das ist sehr ärgerlich, da wir dieses Docker-Image derzeit nicht auf Bluemix verwenden können und derzeit unseren geplanten Rollout behindern.

Können Sie uns mit Details helfen, was könnte falsch sein und wie kann dies behoben werden?

Jede Hilfe wird geschätzt.

Grüße,

Christian

Antwort

1

Offizielle bluemix Support gab den Hinweis, 120 Sekunden zu warten, bevor die Java-Anwendung gestartet wird, die Netzwerkzugriff benötigt. Der vorgeschlagene Weg ist:

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

Damit haben wir Netzwerkzugriff und alles ist in Ordnung.

1

Ist dies erhöht Fehler, wenn der Behälter nach oben beginnt? Wenn dies der Fall ist, benötigen die Docker/IBM Container auf Bluemix ungefähr 30 bis 60 Sekunden Netzwerkstatus: Während dieser Phase kann der Container keine Verbindung zum Netzwerk herstellen. Es sollte wirklich die Hauptursache für den Fehler sein, den Sie erhalten: Wenn die Java SpringBoot-Anwendung versucht, eine Verbindung mit der PostgreSQL-Datenbank herzustellen, wenn der Container noch in der Netzwerkphase ist, wird es mit diesem Fehler fehlschlagen. Sie sollten Ihre Anwendung auf dem Container ausführen, wenn der Container die Netzwerkphase abgeschlossen hat (z. B. über ein Bashskript, das die Verfügbarkeit des PostgreSQL-Servers überprüft, oder einfach Ihren Springboot konfigurieren)

+0

Danke für Ihre Antwort und Kommentar. Leider ist dies ein wenig enttäuschend, denn auf dem Docker Service bei AWS oder mit Docker direkt auf einem Ihrer internen Systeme ist alles in Ordnung mit dem gleichen Docker-Image. Wir müssen also nur ein paar Änderungen am Docker-Image vornehmen, um Bluemix zu unterstützen. Ich denke, das ist nicht die Idee hinter einem unabhängigen Docker-Image. Wie auch immer, haben Sie einen Vorschlag/einen Hinweis zu warten, bis die Netzwerkverbindung hergestellt wurde? –

Verwandte Themen