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