Docker y Cron

4 de agosto de 2020

Lang: cs en de es

Lo que me impulsó a escribir este artículo fue mi experiencia con proyectos que utilizan Docker, pero no como deberían. ¿Estás usando Docker y quieres ejecutar trabajos regulares usando Cron? En este artículo describiré cómo ejecutar Cron en un contenedor Docker.

Por ejemplo, llegué a un proyecto donde el proyecto no se ejecutaba tras un reinicio del servidor, y entre otros problemas, cron no se ejecutaba. U otro proyecto donde Cron ejecutaba tareas no funcionales, pero nadie lo sabía.

Si te estás iniciando con Docker, si es así echa un vistazo al artículo Cómo empezar con Docker.

Docker y los servicios

Docker es virtualización de contenedores. Y cuando lo usas, también estás autodocumentando el proyecto. Para aprovechar el poder y los beneficios de la virtualización de contenedores: supervisión, independencia, personalización, escalado horizontal, sólo necesitas un programa principal (servicio) ejecutándose en cada contenedor. Un programa puede tener múltiples hilos o procesos. Por ejemplo, puede iniciar sesión en un contenedor una vez y ejecutar otros programas, pero el programa principal se supervisa para ver si se está ejecutando. monitorizado para ver si se está ejecutando.
Entonces, al ejecutar contenedores y aplicación idénticos, puedes escalar horizontalmente y lograr un mayor rendimiento de la aplicación.
Así que una situación en la que hay otro servicio (por ejemplo cron) ejecutándose en el contenedor además del programa principal es incorrecta.

Imagen del contenedor

La imagen base preconstruida ejecuta un solo servicio. Sí, es posible modificar la imagen para iniciar automáticamente otros programas (por ejemplo, cron) además del principal, pero si el programa secundario no se está ejecutando el entorno de ejecución (docker, docker swarm, kubernetes) no sabrá sobre el problema, por lo que tampoco tú a no ser que modifiques la aplicación o el contenedor de otra forma.
Pero principalmente, así es como el entorno en tiempo de ejecución monitoriza los contenedores en ejecución - por ejemplo Kubernetes. Además, es poco probable que un diseño de solución dado te permita escalar sin más modificaciones.
Sí habrá usos en los que sea apropiado ejecutar cron en el mismo contenedor, pero será un caso dependiente de específicos de la aplicación/proyecto.

Qué es Cron

Por Cron, la gente entiende la ejecución regular de programas o escribir configuraciones típicas de Cron. Desde el punto de vista de la implementación, un Cron es un programa que se ejecuta automáticamente al inicio en los sistemas unix, se ejecuta constantemente y luego ejecuta tareas periódicamente según la configuración especificada.

¿Cómo ejecutar tareas cron en docker?

Así pues, para ejecutar cron en Docker, necesitas tener Cron instalado, ejecutándose y configurarlo.

A la hora de ejecutar cron en docker, podemos partir de cualquier imagen ya sea básica o ya los componentes necesarios. Se instala cron en esa imagen y se configura la imagen docker para ejecutar cron.

A continuación, reemplaza el archivo /etc/crontab con tu propia configuración para cron.

El Dockerfile para cron, basado en la imagen base Debian, podría tener este aspecto:

FROM debian:buster
MAINTAINER Bc. Josef Jebavý

#cron
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections \
 && apt-get update && apt install cron curl wget jq -y && apt-get clean

# otros componentes

COPIAR crontab /etc/crontab
CMD [ "/usr/sbin/cron","-f","-L /dev/stdout" ]

El resultado es una imagen desde la que arrancas un contenedor que ejecuta un cron independiente de los demás servicios/aplicaciones. Cuando cron se bloquea, se le notificará el bloqueo y, normalmente en kubernetes, el contenedor se reiniciará automáticamente.

Los componentes de la aplicación agrupados resultantes serán entonces que muchos contenedores separados pueden ejecutar diferentes partes de la aplicación, algunos varias veces, y un solo contenedor separado que ejecuta cron al lado.

También puede montar el archivo de configuración para cron al iniciar el contenedor. Esto es útil, por ejemplo, si necesita depurar la configuración en un entorno de desarrollo, porque entonces no tiene que constantemente construir e iniciar un nuevo contenedor.

Ejemplo de archivo cron:

# crontab copia a docker
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

PHP7=/usr/bin/php7.2
PHP5=/usr/bin/php5.6
# m h dom mon dow user command
17 * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etcocron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron | ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

* * * * root date >> /var/www/html/log/cron-test.txt

1.31 * * * * root ( ${PHP5} /var/www/html/cron/10-update.php) >> /var/www/html/log/cron.log 2>&1

Soluciones a medida

Dado que un programador es un experto en desarrollo de software, deberías dejar la preparación de contenedores y el diseño de un entorno de producción en ejecución a expertos en Linux y Docker.

Články na podobné téma

Cambio en las licencias de VMware
Ejecución de Microsoft SQL Server en Linux
Copia de seguridad: el Proxmox Backup Server
Linux como router y cortafuegos
Cómo subir una imagen Docker al Registro Docker
Linux: gestión de volúmenes lógicos
Software RAID para Linux
Ejecutar una aplicación web detrás de un proxy
Migración de correo electrónico
Construcción multietapa Docker
Copia de seguridad de los datos al encender el ordenador
Podman
Importación de Windows a la virtualización Proxmox
Docker y correo PHP
Virtualización Proxmox
Lenovo ThinkPad X1 Carbon: puesta en servicio del módem LTE EM7544
Proyecto Yocto: Cree un sistema operativo personalizado para dispositivos integrados
Preparación de un servidor Linux para ejecutar una aplicación web en Python
Cómo solucionar el bajo rendimiento de los archivos compartidos en Docker
Cómo empezar a utilizar Docker correctamente
Instalación de Linux en un servidor HPE ProLiant DL320e dedicado
Cómo poner a prueba una aplicación web
Por qué utilizar el sistema de archivos JFS
Cómo arrancar desde un disco de 4TB con GTP usando UEFI
Sistema de archivos Btrfs
Raspberry PI
WINE - ejecución de programas Windous en Linux
Sistema operativo GNU/Linux

Boletin informativo

Si está interesado en recibir noticias puntuales por correo electrónico.
Puedes registrarte rellenando tu email suscripción de noticias.


+