Estoy usando rabbitmq y una simple muestra de python de aquí junto con docker-compose. Mi problema es que necesito esperar a que rabbitmq se inicie por completo. Por lo que busqué hasta ahora, no sé cómo esperar con el contenedor x (en mi caso trabajador) hasta que se inicie y (rabbitmq).
Encontré esta publicación de blog donde comprueba si el otro host está en línea. También encontré este comando docker :
Espere
Uso: docker wait CONTENEDOR [CONTENEDOR ...]
Bloquee hasta que un contenedor se detenga, luego imprima su código de salida.
Esperar a que se detenga un contenedor quizás no sea lo que estoy buscando, pero si lo es, ¿es posible usar ese comando dentro de docker-compose.yml? Mi solución hasta ahora es esperar unos segundos y verificar el puerto, pero ¿es esta la forma de lograr esto? Si no espero me sale un error.
docker-compose.yml
worker:
build: myapp/.
volumes:
- myapp/.:/usr/src/app:ro
links:
- rabbitmq
rabbitmq:
image: rabbitmq:3-management
Python hola muestra (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 para trabajador:
FROM python:2-onbuild
RUN ["pip", "install", "pika"]
CMD ["python","rabbit.py"]
Actualización de noviembre de 2015 :
Un script de shell o esperar dentro de su programa es quizás una posible solución. Pero después de ver este problema , estoy buscando un comando o función de docker / docker-compose.
Mencionan una solución para implementar un control de salud, que puede ser la mejor opción. Una conexión tcp abierta no significa que su servicio esté listo o pueda permanecer listo. Además de eso, necesito cambiar mi punto de entrada en mi dockerfile.
Así que espero una respuesta con los comandos a bordo de Docker-compose, que con suerte será el caso si terminan este problema.
Actualización de marzo de 2016
Existe una propuesta para proporcionar una forma integrada de determinar si un contenedor está "vivo". Por lo tanto, Docker-compose puede usarlo en un futuro próximo.
Actualización de junio de 2016
Parece que el chequeo de salud se integrará en Docker en la versión 1.12.0
Actualización enero 2017
Encontré una solución docker-compose ver: Docker Compose espera el contenedor X antes de comenzar Y