Dieses Tutorial ist VALID.

Bitte lies Dir den Disclaimer durch, bevor Du eine Anleitung umsetzt...

Haftungsausschluss / Disclaimer

CRON Events in Docker Containern zum Laufen bringen

Methode #3: Über den cron vom Host-System die Container anschubsen

Im Endeffekt ist cron im Container ja nicht das, das wir wollen, sondern nur „Mittel zum Zweck“, dass er die php-Scripts in den Containern periodisch auslöst. Das können wir aber auch selber von „außen“ machen, denn Docker gibt uns mittels der „docker exec“ Instruktion ein Werkzeug in die Hand, das genau das macht.

Unser Host-System hat zum Glück einen Cron am Laufen. Und diesen werden wir jetzt einfach dafür benutzen, zu bestimmten Zeiten die Container von außen anzupieken und in ihnen die php-Scripte auszuführen.

docker exec ausprobieren

Mit „docker exec“ führen wir innerhalb eines zu benennenden Containers einen Befehl aus (detatched Modus) oder wir ‚teleportieren‘ uns direkt in einen Container und führen die Befehle dort von Hand im Terminal aus (interactive Modus). Für die spätere Verwendung mit Cron nehmen wir den „detatched“ Modus mit der Option „-d“.

Jetzt brauchen wir natürlich den Namen des Containers, in dem wir den Befehl ausführen möchten. Eine Liste bekommen wir mit „docker ps -a“. Wir können entweder die ID eingeben, oder den „Namen“. Wobei für Cron der Name mehr Sinn macht, da sich die ID auch gerne mal ändert, wenn wir ein Update hatten.

Hinter dem Namen des Containers kommt dann der Befehl, den wir darin ausführen möchten. Ich meine, wir müssen hier absolute Pfade schreiben, keine relativen, genau wie bei Cron. Wir starten in jedem Fall im Container den Kommandozeilen-php-Interpreter. „-q“ bedeutet „Quiet“, also eine Ausführung des folgenden Scripts mit möglichst wenig Text. „-f“ heißt, dass php eine Datei ausführen soll, die jetzt angegeben wird.

Und so setzt sich der Befehl zum Beispiel für das Anstupsen der Hintergrunddienste eines WordPress-Containers zusammen:
(Die senkrechten Striche (|) gehören nicht zum Befehl sondern dienen nur zur besseren Anschauung)

docker exec | -d | containername | /usr/local/bin/php -q -f | /var/www/html/wp-cron.php

Wenn wir WordPress schon am Start haben, können wir das gleich testen ;)

Das sollte funktionieren. Der nächste Schritt ist dann, das regelmäßig und automatisch über Cron auszuführen, damit wir nicht jedes Mal selber ran müssen…

Starten wir mal einen Cron-Exkurs:

#########################################################################################################################
# User-Crontabs:        /var/spool/cron/crontabs/[user]
# System-Crontabs:      /etc/crontab
# Crontab-LOG:          grep CRON /var/log/syslog
# Spezialparameter:     @reboot, @daily, @hourly, @weekly, @monthly, @yearly
#  @reboot              |einmalig, beim Start des Systems nach dem Booten|
#  @daily (@midnight)   |einmal pro Tag|        0 0 * * * (jeden Tag um 0:00 Uhr)
#  @hourly              |einmal pro Stunde|     0 * * * * (zu jeder vollen Stunde)
#  @weekly              |einmal pro Woche|      0 0 * * 0 (jede Woche am Sonntag um 0:00 Uhr)
#  @monthl              |einmal im Monat|       0 0 1 * * (jeden Ersten im Monat um 0:00 Uhr)
#  @yearly (@annually)  |einmal im Jahr|        0 0 1 1 * (jährlich an Neujahr um 0:00 Uhr)
#
# Minute Stunde Tag  Monat Wochentag   BEFEHL
# 0-59   0-23   1-31 1-12  0-7(0/7=So) ### Pfad in voller Länge "absolut", nicht "relativ" ###
# Bei Befehlen immer den KOMPLETTEN PFAD angeben!
#  m     h     d     M     W
#  *     *     *     *     *  <program> <parameter>
#  |     |     |     |     |
#  |     |     |     |     +---- Wochentag (0 - 7 | 0/7 = Sonntag)
#  |     |     |     +---------- Monat (1 - 12)
#  |     |     +---------------- Tag (1 - 31)
#  |     +---------------------- Stunde (0 - 23)
#  +---------------------------- Minute (0 - 59)
#
# Spezialschreibweise: */4 = "jede 4. Zeiteinheit"
# !! Man sollte aber bedenken, dass * */2 * * * beispielsweise den Befehl
# 60 mal (also zu jeder Minute) jede zweite Stunde ausführt.
#########################################################################################################################

Relevant an dem Schaubild ist Zeile 17: Wir stellen hier quasi mittels fünf Stellschrauben (Minuten / Stunden / Tage / Monate / Wochentage) Zeitintervalle ein. Ein Stern „*“ bedeutet „zu jedem möglichen Inkrement“. „* * * * *“ würde bedeuten, dass der hinten angestellte Befehl zu jeder Minute jeder Stunde jedes Tages jedes Monats jedes Wochentags ausgeführt wird. Also wortwörtlich jede Minute.

„Zu jeder Stunde“ schreibt man dann z.B. „0 * * * *“. Also „jede ’nullte‘ Minute zu jeder Stunde jedes Tages jedes Monats jedes Wochentags“. Sprich einmal pro Stunde zur Minute „0“.

Stündlich ist aber meistens zu lang, also brauchen wir eine feinere Granulierung. Hier helfen die „Alle X von“ Schreibweisen:
„*/15“ ist „jede 15. Einheit“. „*/15 * * * *“ bedeutet „alle 15 Einheiten“ = „zu jeder viertel Stunde“ bzw. „vier Mal in der Stunde“ (zu Minute 0 / 15 / 30 / 45) .
„*/20“ ist „alle 20 Einheiten“ oder „drei Mal in der Stunde“ (zu Minute 0 / 20 / 40), wenn man es bei „Minuten“ einsetzt.
„*/30“ ist „alle 30 Einheiten“ oder „zwei Mal in der Stunde“ (zu Minute 0 / 30), wenn man es bei „Minuten“ einsetzt.

Wollen wir nicht haben, dass die Prozesse genau zu „0“ ausgelöst werden, können wir auch manuell durch Komma getrennt exakte Zeitpunkte festlegen. „7,22,38,53 * * * *“ bedeutet „vier Mal die Stunde“ exakt zu Minute 7, 22, 38 und 53. So können wir die Ausführung der Scripte etwas gegeneinander verschieben, damit nicht alle auf einmal immer zu „Minute 0“ ausgelöst werden. Auf einem „vernünftigen“ Server ist das aber recht egal. Eigentlich. Der Vollständigkeit halber gehört es trotzdem mit dazu ^^

Danach folgt der Befehl. Wichtig ist, dass der Pfad in voller Länge absolut angegeben werden muss und nicht verkürzt relativ geschrieben werden darf.

Hinter dem Befehl befindet sich dann noch folgende Anweisung:

> /dev/null 2>&1

Diese besagt, dass eventuelle Ausgaben des Scripts und / oder E-Mails an den Systembenutzer von Cron direkt nach „/dev/null“ geschoben werden. Also in den großen internen Papierkorb…

Crontab editieren

Mit dem Befehl

crontab -e

starten wir den Editor Modus für den Crontab des aktuellen Benutzers. Root in unserem Fall. Beim allerersten Start werden wir nach dem Texteditor unserer Wahl gefragt. Ich belasse hier die Einstellung auf „1 – nano“. Wer hier aber gerne was anderes verwenden will – nur zu :)

Mit „Strg + k“ lösche ich dann alle Zeilen, bis die Crontab komplett leer ist. Oben aus dem Exkurs kopieren wir das komplette Schaubild per Copy/Paste hinein. Dann müssen wir nicht jedes mal suchen, wenn wir die Syntax von Cron brauchen ^^

Verschiedene Cron Events für unsere Anwendungs Container

Über dem Schaubild mache ich mit ein paar „Enter“ etwas Luft und einige Leerzeilen.

Für die folgenden Anwendungen lauten die Cron-Befehle dann nach bestem Wissen und Gewissen folgendermaßen:

WordPress (soll alle 15 Minuten laufen):
*/15 * * * * /usr/bin/docker exec -d wordpress /usr/local/bin/php -q -f /var/www/html/wp-cron.php > /dev/null 2>&1

Matomo (soll alle 20 Minuten laufen):
*/20 * * * * /usr/bin/docker exec -d matomo /usr/local/bin/php -q -f /var/www/html/console core:archive > /dev/null 2>&1

Nextcloud (soll alle 15 Minuten laufen):
*/15 * * * * /usr/bin/docker exec -d nextcloud /usr/local/bin/php -q -f /var/www/html/cron.php > /dev/null 2>&1

Für jeden laufenden Docker Anwendungscontainer tragen wir uns einen Cronjob in die Liste ein. Unser Host kümmert sich dann um das Anstupsen der php-Helferscripts in den jeweiligen Containern…

Wir speichern die Datei ab (Strg + x / y), dann teilt uns unser Debian mit, dass die neue Crontab erfolgreich eingetragen und übernommen wurde.

Und das war’s: Ab jetzt laufen die Helferscripts unserer Anwendung zuverlässig zu den eingestellten Zeiten durch :)

Anzeige *

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Verwendung
von Cookies

Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung.

Scroll to Top