So betreibe ich einen meiner Cron-Container.
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
entry.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!"
So bauen
docker build -t mycron .
Lauf so
docker run -d mycron
Fügen Sie Ihre eigenen Skripte hinzu und bearbeiten Sie die crontab.txt und erstellen Sie einfach das Image und führen Sie es aus. Da es auf Alpine basiert, ist das Bild sehr klein.
crond Funktioniert gut mit Tiny auf Alpine
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["/usr/sbin/crond", "-f"]
sollte aber nicht als Container-Hauptprozess (PID 1) ausgeführt werden, da es Probleme mit dem Ernten von Zombies und Problemen mit der Signalverarbeitung gibt. Weitere Informationen finden Sie in dieser Docker-PR und in diesem Blogbeitrag.
Die Lösung von @ken-cochrane ist wahrscheinlich die beste, es gibt jedoch auch eine Möglichkeit, dies zu tun, ohne zusätzliche Dateien erstellen zu müssen.
Um es ohne zusätzliche Dateien zu machen:
Der Weg zu gehen ist, den Cron in Ihrem entrypoint.sh
zu setzen Datei.
Dockerfile
...
# Your Dockerfile above
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.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
...