Volver a la página principal
martes 5 noviembre 2024
13

Cómo usar depends_on en Docker Compose

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.

Ejemplo básico de uso de 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.

Versiones de 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.

Uso de 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

Explicación de los parámetros

  • test: Comando que se ejecuta para verificar la disponibilidad del servicio. Aquí, pg_isready -U example comprueba si PostgreSQL está listo para aceptar conexiones.
  • interval: Intervalo entre cada comprobación (en este caso, cada 10 segundos).
  • timeout: Tiempo de espera de cada intento.
  • retries: Número de intentos antes de que Docker Compose declare que el servicio no está saludable.

Limitaciones de depends_on

  • Orden de inicio: depends_on solo define el orden de inicio y no garantiza que el servicio esté completamente listo.
  • Salud de los servicios: Para asegurarse de que un servicio esté "listo para usar", es necesario agregar healthcheck o usar scripts de espera personalizados.

Alternativa: Usar scripts de espera

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.

Ejemplo de script de espera en 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.

Referencia oficial

Para más información sobre depends_on, puedes consultar la documentación oficial de Docker Compose.

Etiquetas:
docker
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer