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.