Así es como ejecuto uno de mis contenedores cron.
Dockerfile:
FROM alpine:3.3
ADD crontab.txt /crontab.txt
ADD script.sh /script.sh
COPY entry.sh /entry.sh
RUN chmod 755 /script.sh /entry.sh
RUN /usr/bin/crontab /crontab.txt
CMD ["/entry.sh"]
crontab.txt
*/30 * * * * /script.sh >> /var/log/script.log
entrada.sh
#!/bin/sh
# start cron
/usr/sbin/crond -f -l 8
script.sh
#!/bin/sh
# code goes here.
echo "This is a script, run by cron!"
Construye así
docker build -t mycron .
Corre así
docker run -d mycron
Agregue sus propios scripts y edite crontab.txt y simplemente cree la imagen y ejecútela. Dado que se basa en alpine, la imagen es muy pequeña.
crono funciona bien con tiny en Alpine
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["/usr/sbin/crond", "-f"]
pero no debe ejecutarse como proceso principal de contenedor (PID 1) debido al problema de recolección de zombis y problemas con el manejo de señales. Consulte este Docker PR y esta publicación de blog para obtener más detalles.
La solución de @ken-cochrane es probablemente la mejor, sin embargo, también hay una forma de hacerlo sin necesidad de crear archivos adicionales.
Para hacerlo sin archivos extra:
El camino a seguir es configurar el cron dentro de su entrypoint.sh
archivo.
Dockerfile
...
# Your Dockerfile above
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
punto de entrada.sh
echo "* * * * * echo 'I love running my crons'" >> /etc/crontabs/root
crond -l 2 -f > /dev/stdout 2> /dev/stderr &
# You can put the rest of your entrypoint.sh below this line
...