Automatizar tareas con Cron desde Docker con Ofelia

Tiempo de lectura: 5 minutos

Ofelia es una herramienta de programación de tareas basada en cron para entornos Docker. Proporciona una forma conveniente de programar y ejecutar tareas dentro de contenedores Docker de manera automatizada. Ofelia está diseñada específicamente para entornos donde se utilizan contenedores Docker para ejecutar aplicaciones y servicios.

Ofelia es una herramienta de programación de tareas basada en cron para entornos Docker. Proporciona una forma conveniente de programar y ejecutar tareas dentro de contenedores Docker de manera automatizada. Ofelia está diseñada específicamente para entornos donde se utilizan contenedores Docker para ejecutar aplicaciones y servicios.

A diferencia de cron, que se ejecuta en el sistema host, Ofelia se ejecuta dentro de un contenedor Docker y utiliza el demonio de Docker para realizar acciones en otros contenedores. Esto significa que Ofelia puede interactuar directamente con los contenedores de tu aplicación, ejecutando comandos o scripts en ellos según una programación definida.

Ofelia utiliza un archivo de configuración en formato INI para definir las tareas programadas. En este archivo, puedes especificar la frecuencia de ejecución de las tareas utilizando la sintaxis de cron o mediante palabras clave predefinidas, como «every 5m» (cada 5 minutos) o «every 1h» (cada 1 hora). Además, puedes definir los comandos o scripts que se ejecutarán como parte de cada tarea programada.

Al utilizar Docker Compose junto con Ofelia, puedes definir tanto los servicios de tu aplicación como las tareas programadas en un solo archivo de configuración. Esto facilita la gestión de la programación y ejecución de tareas relacionadas con tu aplicación en un entorno de contenedores.

Ofelia es una herramienta flexible y poderosa para automatizar tareas en entornos Docker. Puedes utilizarla para realizar una amplia variedad de acciones, como realizar copias de seguridad periódicas de bases de datos, realizar mantenimiento programado en contenedores, enviar notificaciones o ejecutar tareas de limpieza. Su integración con Docker facilita la automatización y orquestación de tareas dentro de tus aplicaciones y servicios basados en contenedores.

Ahora vamos a crear un docker-compose.yml con Ofelia para ver su funcionamiento.

version: '3.1'
services:
  ofelia:
    image: mcuadros/ofelia:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./config/ofelia/config.ini:/etc/ofelia/config.ini
    restart: always

Creamos un archivo llamado config.ini dentro de config/ofelia (creamos también estos directorios)

[job-local "job-executed-on-current-host"]
schedule = @every 1m
command = echo "Hola desde la tarea programada de Ofelia"

La estructura de carpetas es la siguiente:

Y ahora lanzamos el contenedor:

docker compose up -d

En este ejemplo se muestran distintos logs cada 1 minuto y cada 5 minutos.

Este ejemplo está genial, pero solo ejecuta dentro del contenedor de Ofelia, ahora ejecutaremos en otro contenedor externo y de ejemplo.

Para ello, tenemos que asegurarnos que el contenedor esté en la misma red Docker interna que Ofelia.

Para ello primero vamos a modificar el docker-compose.yml con este contenido:

version: '3.1'
services:
  ofelia:
    image: mcuadros/ofelia:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./config/ofelia/config.ini:/etc/ofelia/config.ini
    restart: always

  db:
    image: mariadb:latest
    container_name: maria_db
    environment:
      - MYSQL_ROOT_PASSWORD=password

Y en config.ini añadiremos esto:

# Ejecutar una tarea programada en un contenedor Docker
[job-exec "job-executed-on-running-container"]
schedule = @every 10s
container = maria_db
command = ls -la /var/lib/mysql

Ahora registra los dos jobs:

Y lo ejecuta de esta forma (dentro del contenedor externo, pero el log se ve en el contenedor Ofelia):

También podemos ejecutar una tarea en un contenedor que está en otra red, indicando esto en el config.ini:

# Ejecutar una tarea programada en un contenedor Docker
[job-exec "job-executed-on-running-container"]
schedule = @every 50s
container = maria_db
network = docker_network
command = ls -la /var/lib/mysql

En este caso indicamos el network dónde está nuestro contenedor.

Finalmente podemos configurar muchos comandos, por ejemplo realizar una consulta select a la Base de Datos:

# Ejecutar una tarea programada en un contenedor Docker
[job-exec "job-executed-on-running-container"]
schedule = @every 50s
container = maria_db
network = docker_network
command = mysql -h db -u root -ppassword -e "SELECT * FROM mytable;"

O realizar backups de Base de datos…

Se pueden realizar distintas configuraciones cómo indican en la documentación oficial https://github.com/mcuadros/ofelia

[job-exec "job-executed-on-running-container"]
schedule = @hourly
container = my-container
command = touch /tmp/example

[job-run "job-executed-on-new-container"]
schedule = @hourly
image = ubuntu:latest
command = touch /tmp/example

[job-local "job-executed-on-current-host"]
schedule = @hourly
command = touch /tmp/example


[job-service-run "service-executed-on-new-container"]
schedule = 0,20,40 * * * *
image = ubuntu
network = swarm_network
command =  touch /tmp/example

[job-exec «job-executed-on-running-container»] Esta sección configura una tarea programada llamada «job-executed-on-running-container». Está programada para ejecutarse cada hora (@hourly). La propiedad container especifica el nombre del contenedor en el que se ejecutará la tarea (my-container). El comando touch /tmp/example creará un archivo llamado «example» en la ubicación /tmp dentro del contenedor my-container.

[job-run «job-executed-on-new-container»] Esta sección configura una tarea programada llamada «job-executed-on-new-container». También está programada para ejecutarse cada hora. Sin embargo, en lugar de especificar un contenedor existente, utiliza la propiedad image para indicar la imagen del contenedor (ubuntu:latest). La tarea creará un archivo «example» en /tmp dentro de un nuevo contenedor basado en la imagen de Ubuntu.

[job-local «job-executed-on-current-host»] En contraste con las secciones anteriores, esta sección configura una tarea programada llamada «job-executed-on-current-host» para ejecutarse en el host actual en lugar de un contenedor. Está programada para ejecutarse cada hora, y el comando touch /tmp/example creará un archivo «example» en /tmp del host actual.

[job-service-run «service-executed-on-new-container»] Esta sección configura una tarea programada llamada «service-executed-on-new-container». Está programada para ejecutarse a los minutos 0, 20 y 40 de cada hora (0,20,40 * * * *). Utiliza la propiedad image para indicar la imagen del contenedor (ubuntu). Además, se especifica la propiedad network para indicar la red a la que pertenece el contenedor (swarm_network). El comando touch /tmp/example creará un archivo «example» en /tmp dentro de un nuevo contenedor basado en la imagen de Ubuntu y conectado a la red swarm_network.

Recuerda que «service-executed-on-new-container» es el nombre del job y que se tiene que cambiar para cada job que creemos.

Además, también permite generar alertas y avisos, por email, slack…

6 comentarios en «Automatizar tareas con Cron desde Docker con Ofelia»

Deja un comentario