2017-12-18 9 views
3

Ich verwende docker, um mehrere Container zu erstellen, von denen einer eine Rabbitmq-Instanz enthält und ein anderer die Aktion node.js enthält, die auf die Queue-Aktivität reagieren soll . Beim Durchlaufen der Docker-Compose-Protokolle sehe ich viele ECONNREFUSED-Fehler, bevor ich sehe, wo die Zeile beginnt, die anzeigt, dass rabbitmq in seinem Container gestartet wurde. Dies scheint darauf hinzudeuten, dass rabbitmq anscheinend nach dem Dienst beginnt, der es benötigt.node.js, Rabbitmq & Docker: Der Dienst mit seneca scheint vor rabbitmq zu starten

Als Sidebar, nur alle anderen möglichen Ursachen hier zu eliminieren ist die Verbindungszeichenfolge für node.js zu rabbitmq verbinden:

amqp://rabbitmq:5672 

und hier ist der Eintrag für rabbitmq im Docker-compose.yaml Datei:

rabbitmq: 
container_name: "myapp_rabbitmq" 
    tty: true 
    image: rabbitmq:management 
    ports: 
    - 15672:15672 
    - 15671:15671 
    - 5672:5672 
    volumes: 
    - /rabbitmq/lib:/var/lib/rabbitmq 
    - /rabbitmq/log:/var/log/rabbitmq 
    - /rabbitmq/conf:/etc/rabbitmq/ 
service1: 
    container_name: "service1" 
    build: 
    context: . 
    dockerfile: ./service1.dockerfile 
    links: 
    - mongo 
    - rabbitmq 
    depends_on: 
    - mongo 
    - rabbitmq 
service2: 
    container_name: "service2" 
    build: 
    context: . 
    dockerfile: ./service2/dockerfile 
    links: 
    - mongo 
    - rabbitmq 
    depends_on: 
    - mongo 
    - rabbitmq 

Was ist die Lösung für dieses Timing-Problem?

Wie kann ich rabbitmq starten, bevor der Verbraucher startet?

Bitte lassen Sie mich wissen, wenn dies kein Timing-Problem ist, sondern eine Konfiguration. Problem in dem Docker-Compose.yml-Eintrag, den ich aufgelistet habe?

Antwort

1

Sie müssen den Boot-Vorgang Ihrer abhängigen Container steuern. Im Folgenden Dokumente die gleiche

https://docs.docker.com/compose/startup-order/

ich in der Regel wait-for-it.sh Datei von unten Projekt

https://github.com/vishnubob/wait-for-it

So verwenden werde ich in einen unter Befehl habe meine service1

wait-for-it.sh rabbitmq:5672 -t 90 -- command with args to launch service1 
+0

Ich habe das Skript hinzugefügt und erhalte "FEHLER: für app_myapp Kann den Dienst nicht starten meine App: oci Laufzeitfehler: container_linux.go: 265: startender Container-Prozess verursacht" exec: \ "./ wait-for-it.sh \": stat ./wait-for-it.sh: keine solche Datei oder kein Verzeichnis ". Das ist seltsam, da sich die Datei docker_compose.yaml im selben Ordner wie die Datei wait-for-it.sh befindet. Dies ist die Befehlszeile, die ich hinzugefügt habe , "Befehl: [" ./wait-for-it.sh "," rabbitmq: 5672 "," -t "," 90 "]" – user1790300

4

Es sieht nicht so aus, als hätten Sie eine komplette Docker-Compose-Datei hinzugefügt. Ich würde erwarten, dass Sie auch Ihren Knoten-Container in der Zusammensetzung sehen. Ich denke, das Problem ist, dass Sie eine

depends_on: 
    - "rabbitmq" 

Im Knoten Behälter Teil Ihrer Docker komponieren müssen

Weitere Informationen über Compose Abhängigkeiten hier: https://docs.docker.com/compose/startup-order/

Note, wie diese Seite schlägt vor, sollten Sie tun Dies in Verbindung mit der Widerstandsfähigkeit Ihrer App gegen Ausfälle von externen Diensten.

+0

fügte ich die anderen Dienste, die von Rabbitmq abhängen. Ich habe für beide eine depends_on hinzugefügt. – user1790300