# 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](/reference/compose-file/services/#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_started`
- `service_healthy`: Especifica que se espera que una dependencia esté "saludable" (lo cual se define con `healthcheck`) 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

```yaml
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: 10s
```

Compose 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`.

## Información de referencia

- [`depends_on`](/reference/compose-file/services/#depends_on)
- [`healthcheck`](/reference/compose-file/services/#healthcheck)

