Controlar el orden de inicio y parada en Compose
Puedes controlar el orden de inicio y parada de los servicios con el atributo
depends_on. Compose siempre inicia y detiene los contenedores en orden de dependencia, donde las dependencias se determinan mediante depends_on, links, volumes_from y network_mode: "service:...".
Por ejemplo, si tu aplicación necesita acceder a una base de datos y ambos servicios se inician con docker compose up, existe la posibilidad de que falle debido a que el servicio de la aplicación podría iniciarse antes que el de la base de datos y no encontraría una base de datos capaz de manejar sus sentencias SQL.
Controlar el inicio
Al iniciarse, Compose no espera a que un contenedor esté "listo", solo a que esté en ejecución. Esto puede causar problemas si, por ejemplo, tienes un sistema de base de datos relacional que necesita iniciar sus propios servicios antes de poder manejar las conexiones entrantes.
La solución para detectar el estado de preparación (listo) de un servicio es utilizar el atributo condition con una de las siguientes opciones:
service_startedservice_healthy: Especifica que se espera que una dependencia esté "saludable" (lo cual se define conhealthcheck) antes de iniciar un servicio dependiente.service_completed_successfully: Especifica que se espera que una dependencia se ejecute hasta completarse con éxito antes de iniciar un servicio dependiente.
Ejemplo
services:
web:
build: .
depends_on:
db:
condition: service_healthy
restart: true
redis:
condition: service_started
redis:
image: redis
db:
image: postgres:18
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 10s
retries: 5
start_period: 30s
timeout: 10sCompose crea los servicios en orden de dependencia. db y redis se crean antes que web.
Compose espera a que pasen las comprobaciones de estado (healthchecks) en las dependencias marcadas con service_healthy. Se espera que db esté "saludable" (según lo indicado por healthcheck) antes de que se cree web.
restart: true garantiza que si db se actualiza o se reinicia debido a una operación explícita de Compose, por ejemplo docker compose restart, el servicio web también se reinicie automáticamente, asegurando que restablezca las conexiones o dependencias correctamente.
La comprobación de estado (healthcheck) para el servicio db utiliza el comando pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB} para verificar si la base de datos PostgreSQL está lista. El servicio se reintenta cada 10 segundos, hasta 5 veces.
Compose también elimina los servicios en orden de dependencia. web se elimina antes que db y redis.