Algunos comandos como up -d service_name o start service_name están regresando de inmediato y esto es bastante útil si no desea que los contenedores que se ejecutan dependan del estado del shell, como lo hacen con regular up service_name. El único caso de uso es ejecutarlo desde algún tipo de servidor de integración/entrega continuo.
Pero esta forma de ejecutar / iniciar servicios no proporciona ninguna retroalimentación sobre el estado real del servicio después.
Yo tenía una necesidad similar. Sin embargo, tengo un restart: always en mi entorno. Por lo tanto, puede ser un poco complicado detectar si algo se bloquea y se reinicia en un bucle.
Hice una comprobación de Icnga / Nagios para comparar también las horas creadas y de inicio. Tal vez sea útil para alguien más en el futuro:
#!/usr/bin/env pythonfrom __future__ import print_functionimport argparsefrom datetime import timedeltafrom datetime import datetimeimport sysfrom dateutil.parser import parse as parse_dateimport dockerimport pytzparser = argparse.ArgumentParser()parser.add_argument("compose_project", help="The name of the docker-compose project")parser.add_argument("compose_service", help="The name of the docker-compose service")args = vars(parser.parse_args())client = docker.from_env()service_containers = client.containers.list(filters={ "label": [ "com.docker.compose.oneoff=False", "com.docker.compose.project={}".format(args["compose_project"]), "com.docker.compose.service={}".format(args["compose_service"]) ]})if len(service_containers) == 0: print("CRITICAL: project({})/service({}) doesn't exist!".format( args["compose_project"], args["compose_service"])) sys.exit(2)elif len(service_containers) > 1: print("CRITICAL: project({})/service({}) has more than 1 " "container!".format( args["compose_project"], args["compose_service"])) sys.exit(2)service_container = service_containers[0]created_at = parse_date(service_container.attrs['Created'])status = service_container.attrs['State']['Status']started_at = parse_date(service_container.attrs['State']['StartedAt'])now = datetime.utcnow().replace(tzinfo=pytz.utc)uptime = now - started_atif status in ['stopped', 'exited', 'dead']: print("CRITICAL: project({})/service({}) is status={}".format( args["compose_project"], args["compose_service"], status)) sys.exit(2)if (started_at - created_at) > timedelta(minutes=5): if uptime < timedelta(seconds=5): print("CRITICAL: project({})/service({}) appears to be " "crash-looping".format( args["compose_project"], args["compose_service"])) sys.exit(2)if status == "restarting": print("WARNING: project({})/service({}) is restarting".format( args["compose_project"], args["compose_service"])) sys.exit(1)print ("OK: project({})/service({}) is up for {}".format( args["compose_project"], args["compose_service"], uptime))sys.exit(0)
los contenedores se inician y ejecutan indefinidamente o se detienen inmediatamente con un código de error (es decir, por falta de configuración)
realiza la comprobación solo una vez después de que docker-compose up-d regrese
puede comprobar si hay algún contenedor detenido debido a un error con:docker ps -a | grep 'Exited (255)'.
Esta comprobación funciona correctamente incluso en el caso de contenedores que se espera que se detengan inmediatamente sin errores (es decir, contenedores de datos), ya que su estado (de docker ps -a) está marcado como Exited (0).
Por ejemplo, en nuestro docker-compose.yml, comenzamos nuestros contenedores con:
Puedes grep para (healthy) o/y (unhealthy) imágenes para actuar correctamente.
En este ejemplo, estoy probando docker-compose cada 5 segundos para ejecutar el servicio con (healthy) estatus.Si el script encuentra tal servicio, interrumpirá la ejecución.Si el script supera los 300 segundos, se cerrará con un código de error.
#!/bin/bashSECONDS=0LIMIT=300x=$(docker-compose -f /mnt/<service>/docker-compose.yaml ps <service> | grep -c '(healthy)')while [[ $x == "0" ]]; do echo "Please wait until <service> becomes healthy" sleep 5 x=$(docker-compose -f /mnt/<service>/docker-compose.yaml ps <service> | grep -c '(healthy)') EXPIRED=$SECONDS if [[ $x == "1" ]]; then echo "<service> is healthy..." break elif [[ $LIMIT -lt $EXPIRED ]]; then echo "<service> startup has exceeded 5m timeout, exiting!" exit 1 fidone