Configurar un cron en paralelo a un trabajo de una sola vez
Cree un archivo de script, por ejemplo, run.sh, con el trabajo que se supone que debe ejecutarse periódicamente.
#!/bin/bash
timestamp=`date +%Y/%m/%d-%H:%M:%S`
echo "System path is $PATH at $timestamp"
Guardar y Salir.
Use Entrypoint en lugar de CMD
Si tiene varios trabajos para iniciar durante la contenedorización de Docker, use el archivo de punto de entrada para ejecutarlos todos.
El archivo de punto de entrada es un archivo de script que entra en acción cuando se emite un comando de ejecución de Docker. Por lo tanto, todos los pasos que queremos ejecutar se pueden colocar en este archivo de script.
Por ejemplo, tenemos 2 trabajos para ejecutar:
Ejecutar una vez trabajo : echo "El contenedor Docker se ha iniciado"
Ejecute trabajo periódico : run.sh
Crear entrypoint.sh
#!/bin/bash
# Start the run once job.
echo "Docker container has been started"
# Setup a cron schedule
echo "* * * * * /run.sh >> /var/log/cron.log 2>&1
# This extra line makes it a valid cron" > scheduler.txt
crontab scheduler.txt
cron -f
Comprendamos el crontab que se ha configurado en el archivo
* * * * *
: Horario de Cron; El trabajo debe ejecutarse cada minuto. Puede actualizar la programación según sus requisitos.
/run.sh
: La ruta al archivo de script que se ejecutará periódicamente
/var/log/cron.log
: El nombre de archivo para guardar la salida del trabajo cron programado.
2>&1
: Los registros de errores (si los hay) también se redirigirán al mismo archivo de salida utilizado anteriormente.
Nota : No olvide agregar una nueva línea adicional, ya que la convierte en un cron válido.
Scheduler.txt
: la configuración cron completa se redirigirá a un archivo.
Uso de variables de entorno específicas del sistema / usuario en cron
Mi trabajo cron real esperaba la mayoría de los argumentos a medida que las variables de entorno pasaron al comando de ejecución de Docker. Pero, con bash, no pude usar ninguna de las variables de entorno que pertenecen al sistema o al contenedor acoplable.
Entonces, esto surgió como una solución a este problema:
- Agregue la siguiente línea en entrypoint.sh
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
- Actualice la configuración de cron y especifique
SHELL=/bin/bash
BASH_ENV=/container.env
Por fin, entrypoint.sh
debería verse como
#!/bin/bash
# Start the run once job.
echo "Docker container has been started"
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
# Setup a cron schedule
echo "SHELL=/bin/bash
BASH_ENV=/container.env
* * * * * /run.sh >> /var/log/cron.log 2>&1
# This extra line makes it a valid cron" > scheduler.txt
crontab scheduler.txt
cron -f
Por último, pero no menos importante: crea un Dockerfile
FROM ubuntu:16.04
MAINTAINER Himanshu Gupta
# Install cron
RUN apt-get update && apt-get install -y cron
# Add files
ADD run.sh /run.sh
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /run.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh
Eso es. ¡Construye y ejecuta la imagen de Docker!
RUN apt-get update && apt-get install cron