Ich versuche, einen Cronjob innerhalb eines Docker-Containers auszuführen, der ein Shell-Skript aufruft.
Gestern habe ich überall im Web und Stack Overflow gesucht, aber ich konnte nicht wirklich eine Lösung finden, die funktioniert.
Wie kann ich dies tun?
EDIT:
Ich habe ein (kommentiertes) Github-Repository mit einem funktionierenden Docker-Cron-Container erstellt, der ein Shell-Skript in bestimmten Abständen aufruft.
Sie können Ihre crontab in ein Image kopieren, damit der von diesem Image gestartete Container den Auftrag ausführen kann.
Siehe "Run a cron job with Docker" von Julien Boulay in seinem Ekito/docker-cron
:
Erstellen wir eine neue Datei namens "
hello-cron
", um unseren Job zu beschreiben.
* * * * * 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.
Das folgende Dockerfile beschreibt alle Schritte zur Erstellung Ihres Images
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
(siehe Gaafar's comment und How do I make apt-get
install less noisy?:
apt-get -y install -qq --force-yes cron
kann auch funktionieren)
ODER, stellen Sie sicher, dass Ihr Job selbst direkt nach stdout/stderr statt in eine Protokolldatei umleitet, wie in hugoShaka's answer beschrieben:
* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2
Ersetzen Sie die letzte Dockerfile-Zeile durch
CMD ["cron", "-f"]
Siehe auch (über cron -f
, d.h. cron "foreground") "docker ubuntu cron -f
is not working"
Bauen Sie es und führen Sie es aus:
sudo docker build --rm -t ekito/cron-example .
sudo docker run -t -i ekito/cron-example
Seien Sie geduldig, warten Sie 2 Minuten und Ihre Kommandozeile sollte angezeigt werden:
Hello world
Hello world
Eric fügt in den Kommentaren hinzu:
Beachten Sie, dass tail
möglicherweise nicht die richtige Datei anzeigt, wenn sie während der Image-Erstellung erstellt wird.
Wenn das der Fall ist, müssen Sie die Datei während der Container-Laufzeit erstellen oder berühren, damit tail die korrekte Datei erkennt.
Siehe "Ausgabe von tail -f
am Ende eines Docker CMD
wird nicht angezeigt".
Ich habe ein Docker-Image auf der Grundlage der anderen Antworten erstellt, das wie folgt verwendet werden kann
docker run -v "/pfad/zu/cron:/etc/cron.d/crontab" gaafar/cron`
wobei /path/to/cron
der absolute Pfad zur crontab-Datei ist, oder Sie können ihn als Basis in einer Dockerdatei verwenden:
FROM gaafar/cron
# COPY crontab file in the cron directory
COPY crontab /etc/cron.d/crontab
# Add your commands here
Als Referenz dient das Bild hier.
Cron-Jobs werden in /var/spool/cron/crontabs gespeichert (in allen mir bekannten Distributionen). BTW, Sie können eine Cron-Registerkarte in Bash mit etwas wie das zu erstellen:
crontab -l > cronexample
echo "00 09 * * 1-5 echo hello" >> cronexample
crontab cronexample
rm cronexample
Damit wird eine temporäre Datei mit einer Cron-Aufgabe erstellt, die dann mit crontab programmiert wird. Die letzte Zeile entfernt die temporäre Datei.