Sto usando rabbitmq e un semplice esempio di python da qui insieme a docker-compose. Il mio problema è che devo aspettare che rabbitmq si avvii completamente. Da quello che ho cercato finora, non so come aspettare con il contenitore x (nel mio caso) fino all'avvio di y (rabbitmq).
Ho trovato questo post in cui controlla se l'altro host è online. Ho anche trovato questo comando docker :
aspettare
Utilizzo: docker wait CONTAINER [CONTAINER ...]
Blocca fino all'arresto di un contenitore, quindi stampa il suo codice di uscita.
Aspettare che un container si fermi non è forse quello che sto cercando, ma se lo è, è possibile usare quel comando all'interno di docker-compose.yml? La mia soluzione finora è aspettare alcuni secondi e controllare la porta, ma è questo il modo per raggiungere questo obiettivo? Se non aspetto, ricevo un errore.
finestra mobile-compose.yml
worker:
build: myapp/.
volumes:
- myapp/.:/usr/src/app:ro
links:
- rabbitmq
rabbitmq:
image: rabbitmq:3-management
campione ciao pitone (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 per lavoratore:
FROM python:2-onbuild
RUN ["pip", "install", "pika"]
CMD ["python","rabbit.py"]
Aggiornamento novembre 2015 :
Uno script di shell o in attesa all'interno del programma è forse una possibile soluzione. Ma dopo aver visto questo problema sto cercando un comando o una funzione di docker / docker-compose.
Citano una soluzione per l'implementazione di un controllo sanitario, che potrebbe essere l'opzione migliore. Una connessione tcp aperta non significa che il servizio è pronto o potrebbe rimanere pronto. Inoltre, devo modificare il mio punto di accesso nel mio file docker.
Quindi spero in una risposta con i comandi di bordo di composizione docker, che si spera sia il caso se finissero questo problema.
Aggiornamento marzo 2016
Esiste una proposta per fornire un modo integrato per determinare se un contenitore è "vivo". Quindi la docker-compose può forse farne uso in un prossimo futuro.
Aggiornamento giugno 2016
Sembra che il controllo della salute sarà integrato nella finestra mobile nella versione 1.12.0
Aggiornamento gennaio 2017
Ho trovato una soluzione di composizione docker, consultare: Composizione Docker attendere il contenitore X prima di avviare Y