Korzystam z rabbitmq i prostej próbki pytona stąd wraz z docker-compose. Mój problem polega na tym, że muszę poczekać, aż Rabbitmq się w pełni uruchomi. Z tego, co szukałem do tej pory, nie wiem, jak czekać z kontenerem x (w moim przypadku robotnikiem), aż zostanie uruchomiony y (rabbitmq).
Znalazłem ten post na blogu, na którym sprawdza, czy drugi host jest online. Znalazłem również to polecenie dokera :
czekać
Zastosowanie: docker czekać CONTAINER [CONTAINER ...]
Blokuj, aż kontener się zatrzyma, a następnie wydrukuj kod wyjścia.
Oczekiwanie na zatrzymanie kontenera może nie jest tym, czego szukam, ale jeśli tak, to czy można użyć tego polecenia w oknie docker-compose.yml? Jak dotąd moim rozwiązaniem jest poczekanie kilku sekund i sprawdzenie portu, ale czy to jest sposób na osiągnięcie tego ?. Jeśli nie czekam, pojawia się błąd.
docker-compose.yml
worker:
build: myapp/.
volumes:
- myapp/.:/usr/src/app:ro
links:
- rabbitmq
rabbitmq:
image: rabbitmq:3-management
przykładowa python hello (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()
Plik Docker dla pracownika:
FROM python:2-onbuild
RUN ["pip", "install", "pika"]
CMD ["python","rabbit.py"]
Aktualizacja lis 2015 :
Możliwym rozwiązaniem może być skrypt powłoki lub oczekiwanie w twoim programie. Ale po zobaczeniu tego problemu szukam polecenia lub funkcji docker / docker-compose.
Wspominają o rozwiązaniu służącym do kontroli stanu zdrowia, które może być najlepszym rozwiązaniem. Otwarte połączenie TCP nie oznacza, że usługa jest gotowa lub może pozostać gotowa. Ponadto muszę zmienić punkt wejścia w pliku dokera.
Mam więc nadzieję na odpowiedź z komendami docker-komponuj na pokładzie, co, mam nadzieję, będzie miało miejsce, jeśli zakończą ten problem.
Aktualizacja z marca 2016 r
Jest to propozycja dla zapewnienia wbudowany sposobem określenia, czy dany pojemnik jest „żywy”. Więc docker-compose może z niego skorzystać w najbliższej przyszłości.
Aktualizacja z czerwca 2016 r
Wygląda na to, że kontrola zdrowia zostanie zintegrowana z dokerem w wersji 1.12.0
Aktualizacja ze stycznia 2017 r
Znalazłem rozwiązanie komponowania dokera patrz: Docker Compose poczekaj na kontener X przed uruchomieniem Y