Estou usando rabbitmq e um exemplo simples de python daqui em conjunto com o docker-compose. Meu problema é que preciso aguardar a inicialização completa do rabbitmq. Pelo que pesquisei até agora, não sei como esperar com o contêiner x (no meu assistente de caso) até que y (rabbitmq) seja iniciado.
Encontrei este blog onde ele verifica se o outro host está online. Eu também encontrei este comando docker :
esperar
Uso: docker wait CONTAINER [CONTAINER ...]
Bloqueie até que um contêiner pare e imprima seu código de saída.
Esperar a parada de um contêiner talvez não seja o que estou procurando, mas, se for, é possível usar esse comando dentro do docker-compose.yml? Até agora, minha solução é aguardar alguns segundos e verificar a porta, mas é esse o caminho para conseguir isso? Se eu não esperar, recebo um erro.
docker-compose.yml
worker:
build: myapp/.
volumes:
- myapp/.:/usr/src/app:ro
links:
- rabbitmq
rabbitmq:
image: rabbitmq:3-management
Olá, exemplo python (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 trabalhador:
FROM python:2-onbuild
RUN ["pip", "install", "pika"]
CMD ["python","rabbit.py"]
Atualização de novembro de 2015 :
Um script de shell ou aguardar dentro do seu programa é talvez uma solução possível. Mas, depois de ver esse problema , estou procurando um comando ou recurso do docker / docker-componen.
Eles mencionam uma solução para implementar uma verificação de saúde, que pode ser a melhor opção. Uma conexão tcp aberta não significa que seu serviço está pronto ou pode permanecer pronto. Além disso, preciso alterar meu ponto de entrada no meu arquivo docker.
Portanto, espero obter uma resposta com os comandos docker-compose on board, que, esperançosamente, serão o caso se eles terminarem esse problema.
Atualização de março de 2016
Existe uma proposta para fornecer uma maneira interna de determinar se um contêiner está "vivo". Portanto, o docker-compose pode utilizá-lo no futuro próximo.
Atualização junho de 2016
Parece que a verificação de saúde será integrada ao docker na versão 1.12.0
Atualização de janeiro de 2017
Encontrei uma solução docker-compose, consulte: Docker Compose, aguarde o contêiner X antes de iniciar Y