J'utilise rabbitmq et un simple échantillon de python d' ici avec docker-compose. Mon problème est que je dois attendre que rabbitmq démarre complètement. D'après ce que j'ai cherché jusqu'à présent, je ne sais pas comment attendre avec le conteneur x (dans mon assistant social) jusqu'à ce que y (rabbitmq) soit démarré.
J'ai trouvé ce blog où il vérifie si l'autre hôte est en ligne. J'ai également trouvé cette commande docker :
attendre
Utilisation: docker wait CONTAINER [CONTAINER ...]
Bloquer jusqu'à l'arrêt d'un conteneur, puis imprimer son code de sortie.
Attendre l'arrêt d'un conteneur n'est peut-être pas ce que je recherche, mais si c'est le cas, est-il possible d'utiliser cette commande dans le docker-compose.yml? Jusqu'à présent, ma solution est d'attendre quelques secondes et de vérifier le port, mais est-ce le moyen d'y parvenir?. Si je n'attends pas, j'obtiens une erreur.
docker-compose.yml
worker:
build: myapp/.
volumes:
- myapp/.:/usr/src/app:ro
links:
- rabbitmq
rabbitmq:
image: rabbitmq:3-management
échantillon de 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()
Dockerfile pour le travailleur:
FROM python:2-onbuild
RUN ["pip", "install", "pika"]
CMD ["python","rabbit.py"]
Mise à jour de novembre 2015 :
Un script shell ou une attente dans votre programme est peut-être une solution possible. Mais après avoir vu ce problème, je recherche une commande ou une fonctionnalité de docker / docker-compose.
Ils mentionnent une solution pour mettre en place un bilan de santé, qui peut être la meilleure option. Une connexion TCP ouverte ne signifie pas que votre service est prêt ou peut rester prêt. En plus de cela, je dois changer mon point d'entrée dans mon dockerfile.
J'espère donc une réponse avec les commandes embarquées de docker-compose, ce qui sera le cas, espérons-le, si elles finissent ce problème.
Mise à jour mars 2016
Il est proposé de fournir une méthode intégrée pour déterminer si un conteneur est "vivant". Ainsi, docker-compose peut peut-être l'utiliser dans un avenir proche.
Mise à jour juin 2016
Il semble que le bilan de santé sera intégré dans docker dans la version 1.12.0
Mise à jour janvier 2017
J'ai trouvé une solution docker-compose voir: Docker Compose attendre le conteneur X avant de commencer Y