Saltar al contenido

Verifique si el contenedor / servicio se está ejecutando con docker-compose

Este team de trabajo ha estado largas horas investigando la resolución a tu duda, te brindamos la respuesta así que deseamos resultarte de gran ayuda.

Solución:

Solución 1:

  • docker-compose ps -q mostrará el ID del contenedor sin importar si se está ejecutando o no, siempre que se haya creado.
  • docker ps muestra solo los que realmente se están ejecutando.

Combinemos estos dos comandos:

if [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q )` ]; then
  echo "No, it's not running."
else
  echo "Yes, it's running."
fi

docker ps muestra una versión corta de los ID de forma predeterminada, por lo que debemos especificar --no-trunc bandera.

ACTUALIZAR: Lanzó una advertencia de “uso de grep” si el servicio no se estaba ejecutando. Gracias a @Dzhuneyt, aquí está la respuesta actualizada.

if [ -z `docker-compose ps -q ` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q )` ]; then
  echo "No, it's not running."
else
  echo "Yes, it's running."
fi

Solucion 2:

En cuanto a la versión 1.7.1, no hay tales comandos integrados.

En cambio, el exec se puede utilizar de forma similar.

Cuando lo ejecute para el servicio que tiene algunos contenedores, se ejecutará bien:

~/apperture-science $ docker-compose exec chell echo 'Still alive!'
Still alive!
~/apperture-science $ echo $?
0

Pero cuando lo ejecuta para el servicio que no se está ejecutando Servicio contenedores, mostrará un error:

~/apperture-science $ docker-compose exec glados echo "Still alive!"
ERROR: No container found for apperture-science-glados_1
~/apperture-science $ echo $?
1

Por lo tanto, se puede usar para verificar si hay contenedores “vivos” para un servicio dado.


Solucion 3:

Tu puedes correr:

docker-compose ps -q service-name

Y obtendrás la identificación del contenedor si service-name Esta corriendo. Algo como:

18a04e61240d8ffaf4dc3f021effe9e951572ef0cb31da7ce6118f681f585c7f

Si el servicio no se está ejecutando, la salida está vacía, por lo que si desea usar esto en un script, puede hacer algo como:

IS_RUNNING=`docker-compose ps -q service-name`
if [[ "$IS_RUNNING" != "" ]]; then
    echo "The service is running!!!"
fi

Solucion 4:

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 falla y se reinicia en un bucle.

Hice una verificación de Icinga / Nagios para comparar también las horas de creación y de inicio. Tal vez sea útil para alguien más en el futuro:

#!/usr/bin/env python
from __future__ import print_function
import argparse
from datetime import timedelta
from datetime import datetime
import sys

from dateutil.parser import parse as parse_date
import docker
import pytz
parser = 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_at

if 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)

Solucion 5:

Para ver todo servicios en ejecución:

docker-compose ps --services --filter "status=running"

Para ver si tu servicio Esta corriendo:

docker-compose ps --services --filter "status=running" | grep 

Tenga en cuenta que --filter debe usarse con --services por alguna razón extranjera.

valoraciones y reseñas

Si posees algún titubeo y forma de reaccionar nuestro división eres capaz de escribir una glosa y con deseo lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 3.5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *