Ich verwende Rabbitmq und eine einfache Python-Probe von hier zusammen mit Docker-Compose. Mein Problem ist, dass ich warten muss, bis rabbitmq vollständig gestartet ist. Nach dem, was ich bisher gesucht habe, weiß ich nicht, wie ich mit Container x (in meinem Fallbearbeiter) warten soll, bis y (rabbitmq) gestartet wird.
Ich habe diesen Blogpost gefunden, in dem er überprüft, ob der andere Host online ist. Ich habe auch diesen Docker-Befehl gefunden :
warten
Verwendung: Docker warten CONTAINER [CONTAINER ...]
Blockieren Sie, bis ein Container stoppt, und drucken Sie dann seinen Exit-Code.
Das Warten auf das Stoppen eines Containers ist vielleicht nicht das, wonach ich suche, aber wenn ja, ist es möglich, diesen Befehl in der Datei docker-compose.yml zu verwenden? Meine bisherige Lösung besteht darin, einige Sekunden zu warten und den Port zu überprüfen. Ist dies jedoch der Weg, um dies zu erreichen? Wenn ich nicht warte, erhalte ich eine Fehlermeldung.
docker-compose.yml
worker:
build: myapp/.
volumes:
- myapp/.:/usr/src/app:ro
links:
- rabbitmq
rabbitmq:
image: rabbitmq:3-management
Python Hallo Probe (rabbit.py):
import pika
import time
import socket
pingcounter = 0
isreachable = False
while isreachable is False and pingcounter < 5:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect(('rabbitmq', 5672))
isreachable = True
except socket.error as e:
time.sleep(2)
pingcounter += 1
s.close()
if isreachable:
connection = pika.BlockingConnection(pika.ConnectionParameters(
host="rabbitmq"))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print (" [x] Sent 'Hello World!'")
connection.close()
Dockerfile für Arbeiter:
FROM python:2-onbuild
RUN ["pip", "install", "pika"]
CMD ["python","rabbit.py"]
Update November 2015 :
Ein Shell-Skript oder das Warten in Ihrem Programm ist möglicherweise eine mögliche Lösung. Aber nachdem ich dieses Problem gesehen habe, suche ich nach einem Befehl oder einer Funktion von Docker / Docker-Compose selbst.
Sie erwähnen eine Lösung für die Durchführung eines Gesundheitschecks, die möglicherweise die beste Option ist. Eine offene TCP-Verbindung bedeutet nicht, dass Ihr Dienst bereit ist oder möglicherweise bereit bleibt. Außerdem muss ich meinen Einstiegspunkt in meiner Docker-Datei ändern.
Ich hoffe also auf eine Antwort mit Docker-Compose-On-Board-Befehlen, die hoffentlich der Fall sein wird, wenn sie dieses Problem lösen.
Update März 2016
Es gibt einen Vorschlag für die Bereitstellung einer integrierten Methode, um festzustellen, ob ein Container "lebt". Docker-Compose kann es also möglicherweise in naher Zukunft nutzen.
Update Juni 2016
Es scheint , dass der Gesundheitscheck wird integriert in Version 1.12.0 in Docker
Update Januar 2017
Ich habe eine Docker-Compose-Lösung gefunden, siehe: Docker Compose Warten Sie auf Container X, bevor Sie Y starten