La opción depends_on en Docker Compose permite definir dependencias entre servicios, especificando el orden de inicio de los contenedores. Esto es útil cuando un servicio depende de otro para funcionar correctamente, como cuando una aplicación depende de una base de datos.
Sin embargo, es importante tener en cuenta que depends_on no espera a que un servicio esté completamente listo, solo asegura que se intente iniciar antes que el servicio dependiente. Para gestionar la disponibilidad, es necesario utilizar scripts de espera adicionales o configuraciones como healthcheck.
depends_on
En el siguiente ejemplo, un servicio web depende de una base de datos db, de modo que Docker Compose primero intentará iniciar db y luego web.
version: '3.8'
services:
web:
image: my_web_app
depends_on:
- db
ports:
- "8080:80"
db:
image: postgres
environment:
POSTGRES_USER: example
POSTGRES_PASSWORD: example
Aquí, Docker Compose intentará iniciar db antes de iniciar web. Sin embargo, esto no garantiza que db esté completamente listo cuando web inicie, por lo que podríamos necesitar pasos adicionales para garantizar la disponibilidad.
depends_on y opciones de espera
En versiones anteriores a 3.4, depends_on solo define el orden de inicio y no permite verificar la disponibilidad de un servicio. En la versión 3.4 y posteriores, puedes combinar depends_on con el parámetro healthcheck para hacer que un servicio dependa de la "salud" de otro.
healthcheck con depends_on
En este caso, usamos healthcheck para verificar que el servicio de base de datos esté listo antes de que el servicio web se inicie completamente.
version: '3.8'
services:
web:
image: my_web_app
depends_on:
db:
condition: service_healthy
ports:
- "8080:80"
db:
image: postgres
environment:
POSTGRES_USER: example
POSTGRES_PASSWORD: example
healthcheck:
test: ["CMD-SHELL", "pg_isready -U example"]
interval: 10s
timeout: 5s
retries: 5
pg_isready -U example comprueba si PostgreSQL está listo para aceptar conexiones.
depends_on
depends_on solo define el orden de inicio y no garantiza que el servicio esté completamente listo.
healthcheck o usar scripts de espera personalizados.
En casos donde healthcheck no sea suficiente, puedes incluir un script de espera en el propio contenedor web, para asegurarte de que la base de datos esté disponible antes de intentar la conexión.
web:
version: '3.8'
services:
web:
image: my_web_app
depends_on:
- db
entrypoint: ["./wait-for-db.sh"]
ports:
- "8080:80"
db:
image: postgres
environment:
POSTGRES_USER: example
POSTGRES_PASSWORD: example
El archivo wait-for-db.sh sería un script que intenta conectarse a la base de datos varias veces antes de lanzar el servicio web.
Para más información sobre depends_on, puedes consultar la documentación oficial de Docker Compose.
Jorge García
Fullstack developer