Estoy tratando de ejecutar un cronjob dentro de un contenedor docker que invoca un script de shell.
Ayer he estado buscando por toda la web y stack overflow, pero realmente no pude encontrar una solución que funcione.
¿Cómo puedo hacer esto?
EDIT:
He creado un (comentado) repositorio github con un contenedor docker cron que invoca un script de shell en un intervalo determinado.
Puedes copiar tu crontab en una imagen, para que el contenedor lanzado desde dicha imagen ejecute el trabajo.
Ver "Ejecutar un trabajo cron con Docker" de Julien Boulay en su Ekito/docker-cron
:
Creemos un nuevo archivo llamado "Hola-cron`" para describir nuestro trabajo.
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# An empty line is required at the end of this file for a valid cron file.
El siguiente Dockerfile describe todos los pasos para construir su imagen
FROM ubuntu:latest
MAINTAINER [email protected]
RUN apt-get update && apt-get -y install cron
# Copy hello-cron file to the cron.d directory
COPY hello-cron /etc/cron.d/hello-cron
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron
# Apply cron job
RUN crontab /etc/cron.d/hello-cron
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# Run the command on container startup
CMD cron && tail -f /var/log/cron.log
(ver Gaafar's comentario y ¿Cómo puedo hacer que apt-get
instale con menos ruido?:
apt-get -y install -qq --force-yes cron
también puede funcionar)
O bien, asegúrese de que su trabajo en sí redirige directamente a stdout/stderr en lugar de a un archivo de registro, como se describe en hugoShaka's respuesta:
* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2
Reemplaza la última línea del Dockerfile con
CMD ["cron", "-f"]
Véase también (sobre cron -f
, que es decir cron "en primer plano") "docker ubuntu cron -f
no funciona"
Construir y ejecutar:
sudo docker build --rm -t ekito/cron-example .
sudo docker run -t -i ekito/cron-example
Tenga paciencia, espere 2 minutos y su línea de comandos debería aparecer:
Hello world
Hello world
Eric añade en los comentarios:
Tenga en cuenta que tail
puede no mostrar el archivo correcto si se crea durante la construcción de la imagen.
Si ese es el caso, necesitas crear o tocar el archivo durante el tiempo de ejecución del contenedor para que tail recoja el archivo correcto.
Ver "La salida de tail -f
al final de un CMD
de docker no se muestra".
He creado una imagen Docker basada en las otras respuestas, que se puede utilizar como
docker run -v "/ruta/a/cron:/etc/cron.d/crontab" gaafar/cron
donde ruta/al/cron
: ruta absoluta al archivo crontab, o puedes usarlo como base en un Dockerfile:
FROM gaafar/cron
# COPY crontab file in the cron directory
COPY crontab /etc/cron.d/crontab
# Add your commands here
Como referencia, la imagen está aquí.
Los trabajos de cron se almacenan en /var/spool/cron/crontabs (lugar común en todas las distros que conozco). BTW, Usted puede crear una ficha de cron en bash usando algo así:
crontab -l > cronexample
echo "00 09 * * 1-5 echo hello" >> cronexample
crontab cronexample
rm cronexample
Esto creará un archivo temporal con la tarea de cron, y luego programarlo con crontab. La última línea elimina el archivo temporal.