fig up: los contenedores Docker inician la synchronization

Para uno de los proyectos de mi casa, decidí usar contenedores docker e higos para orquestación (la primera vez que usaba esas herramientas).

Aquí está mi fig.yaml:

rabbitmq: image: dockerfile/rabbitmq:latest mongodb: image: mongo app: build: . command: python /code/app/main.py links: - rabbitmq - mongodb volumes: - .:/code 

El time de inicio de Rabbitmq es mucho más lento que el time de carga de mi aplicación. Aunque el contenedor rabbitmq comienza a cargarse primero (ya que está en enlaces de aplicaciones), cuando mi aplicación intenta conectarse al server rabbitmq todavía no está disponible (definitivamente está cargando problemas de time, ya que si solo inserto sleep durante 5 segundos antes de conectar con rabbitmq – todo funciona bien). ¿Hay alguna forma estándar de resolver los problemas de synchronization del time de carga?

Gracias.

No creo que haya una forma estándar de resolver esto, pero es un problema conocido y algunas personas tienen soluciones aceptables.

Hay una propuesta en el rastreador de problemas de Docker sobre no considerar un contenedor como iniciado hasta que esté escuchando en los puertos expuestos. Sin embargo, probablemente no será aceptado debido a otros problemas que crearía en otros lugares. También hay una propuesta de higo sobre el mismo tema.

La solución fácil es dormir como dice @jcortejoso. Un ejemplo de http://blog.chmouel.com/2014/11/04/avoiding-race-conditions-between-containers-with-docker-and-fig/ :

 function check_up() { service=$1 host=$2 port=$3 max=13 # 1 minute counter=1 while true;do python -c "import socket;s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);s.connect(('$host', $port))" \ >/dev/null 2>/dev/null && break || \ echo "Waiting that $service on ${host}:${port} is started (sleeping for 5)" if [[ ${counter} == ${max} ]];then echo "Could not connect to ${service} after some time" echo "Investigate locally the logs with fig logs" exit 1 fi sleep 5 (( counter++ )) done } 

Y luego use check_up "DB Server" ${RABBITMQ_PORT_5672_TCP_ADDR} 5672 antes de iniciar su server de aplicaciones, como se describe en el enlace anterior.

Otra opción es usar docker-wait . En tu fig.yml .

 rabbitmq: image: dockerfile/rabbitmq:latest mongodb: image: mongo rabbitmqready: image: aanand/wait links: - rabbitmq app: build: . command: python /code/app/main.py links: - rabbitmqready - mongodb volumes: - .:/code 

Problemas similares que he encontrado los he solucionado usando un script personalizado configurado como CMD en mis Dockerfiles . Luego puede ejecutar cualquier command de verificación que desee (por ejemplo, sleep por un time o esperar que el service lo escuche). Creo que no hay una forma estándar de hacer esto, de todos modos creo que la mejor manera sería ejecutar la aplicación y pedirle al service externo que esté funcionando y conectarse, pero esto no es posible en la mayoría de los casos. casos.

Para realizar testings en nuestro CI, creamos una pequeña utilidad que se puede usar en un contenedor Docker para esperar a que los services vinculados estén listos. Encuentra automáticamente todos los services TCP vinculados desde sus variables de entorno y repetidamente y al mismo time intenta establecer conexiones TCP hasta que tenga éxito o se agote el time.

También escribimos una publicación en el blog que describe por qué la construimos y cómo la utilizamos .