So verwenden Sie Cron mit Ihren Docker-Containern

0
771

Das Ausführen von Hintergrundaufgaben nach einem Zeitplan ist eine Standardanforderung von Back-End-Diensten. Die Einrichtung war früher einfach – Sie definieren Ihre Aufgaben in der Crontab Ihres Servers und nennen es einen Tag. Sehen wir uns an, wie Sie Cron verwenden können, während Sie Docker für die Bereitstellung verwenden.

Die Containerisierung Ihrer Dienste erhöht die Entwicklerproduktivität. Gleichzeitig können Sie sich fragen, wie traditionelle Systemadministratoren den Docker-Konzepten entsprechen. Sie haben mehrere Optionen, wenn Sie Cron mit Docker-Containern verwenden, und wir werden sie unten in der Reihenfolge ihrer Eignung untersuchen. Bevor Sie fortfahren, stellen Sie sicher, dass Sie Docker installiert und ein Docker-Image Ihrer Anwendung erstellt haben.

Verwenden der Crontab des Hosts

Grundsätzlich können Sie immer die Cron-Installation des Hosts verwenden, auf dem Ihre Docker-Engine ausgeführt wird. Stellen Sie sicher, dass cron installiert ist, und bearbeiten Sie dann die crontab des Systems wie gewohnt.

Sie können docker exec verwenden, um einen Befehl in einem vorhandenen Container auszuführen:

*/5 * * * * docker exec example_app_container /example-scheduled-task.sh

Dies funktioniert nur, wenn Sie den Namen des Containers im Voraus kennen. Normalerweise ist es besser, einen neuen Container zu erstellen, der nur zum Ausführen der Aufgabe existiert:

*/5 * * * * docker run –rm example_app_image:latest /example-scheduled-task.sh >

Alle fünf Minuten erstellt die Cron-Installation Ihres Systems einen neuen Docker-Container mit dem Image Ihrer App. Docker führt das Skript /example-scheduled-task.sh innerhalb des Containers aus. Der Container wird zerstört (–rm), sobald das Skript beendet wird.

Verwendung von Cron in Ihren Containern

Verwendung des Hosts& #8217;s crontab unterbricht die Containerisierung von Docker, da die geplanten Aufgaben eine manuelle Einrichtung auf Ihrem System erfordern. Sie müssen sicherstellen, dass Cron auf jedem Host installiert ist, auf dem Sie bereitstellen. Obwohl es in der Entwicklung nützlich sein kann, sollten Sie Cron nach Möglichkeit in Ihre Dockerized-Dienste integrieren.

Die meisten gängigen Docker-Basisimages enthalten standardmäßig keinen Cron-Daemon. Sie können es in Ihrem Dockerfile installieren und dann die crontab Ihrer Anwendung registrieren.

Erstellen Sie zuerst eine neue crontab-Datei in Ihrer Codebasis:

*/5 * * * * /usr/bin/sh /example-scheduled-task.sh

Ändern Sie als Nächstes Ihre Docker-Datei, um cron zu installieren und registrieren Sie Ihre crontab – So können Sie das mit einem Debian-basierten Image machen:

apt-get update ausführen && apt-get install -y cron KOPIEREN example-crontab /etc/cron.d/example-crontab RUN chmod 0644 /etc/cron.d/example-crontab && crontab /etc/cron.d/example-crontab

Wir installieren cron und kopieren die crontab unserer Codebasis in das Verzeichnis /etc/cron.d. Als nächstes müssen wir die Berechtigungen in unserer crontab ändern, um sicherzustellen, dass sie für cron zugänglich ist. Verwenden Sie abschließend den Befehl crontab, um die Datei dem cron-Daemon bekannt zu geben.

Werbung

Um diese Einrichtung abzuschließen, müssen Sie den Befehl oder den Einstiegspunkt Ihres Images ändern, um den Cron-Daemon zu starten, wenn die Container ausgeführt werden. Sie können dies nicht mit einer RUN-Phase in Ihrem Dockerfile erreichen, da dies vorübergehende Schritte sind, die nicht über die Build-Phase des Images hinaus bestehen bleiben. Der Dienst würde innerhalb des kurzlebigen Containers gestartet, der zum Erstellen der Ebene verwendet wurde, nicht in den endgültigen Containern, die das fertige Image ausführen.

Wenn die einzige Aufgabe Ihres Containers darin besteht, cron – die wir weiter unten näher besprechen werden – Sie können ENTRYPOINT [“cron”, “-f”] zu Ihrem Dockerfile hinzufügen, um es als Vordergrundprozess zu starten. Wenn Sie einen anderen Prozess im Vordergrund behalten müssen, z. B. einen Webserver, sollten Sie ein dediziertes Einstiegspunktskript erstellen (z. B. ENTRYPOINT [“bash”, “init.sh”]) und service cron start als Befehl in dieser Datei hinzufügen .

RELATED: So installieren Sie Docker und Docker Compose unter Linux

Cron von den Diensten Ihrer Anwendung trennen

Die Implementierung des im vorherigen Abschnitt beschriebenen Setups bietet eine robustere Lösung, als sich auf die crontab des Hosts zu verlassen. Wenn Sie den Cron-Daemon zu den Containern hinzufügen, die Ihre Anwendung bereitstellen, wird sichergestellt, dass jeder, der Ihr Docker-Image verwendet, automatisch geplante Aufgaben eingerichtet hat.

Dies führt jedoch immer noch zu einer Vermischung der Bedenken. Am Ende haben Ihre Container zwei Aufgaben: – Erstens, um die Funktionalität der Anwendung bereitzustellen, und zweitens, um Cron am Leben zu erhalten und die geplanten Aufgaben auszuführen. Idealerweise sollte jeder Container eine bestimmte Funktionalitätseinheit bereitstellen.

Wenn möglich, sollten Sie Ihre Cron-Aufgaben in einem separaten Container für Ihre Anwendung ausführen. Wenn Sie ein Web-Backend erstellen, bedeutet dies, dass ein Container Ihren Webserver bereitstellt und ein anderer, der Cron im Vordergrund ausführt.

RELATEDSo führen Sie GUI-Anwendungen in einem Docker-Container aus

Ohne diese Trennung können Sie keinen Orchestrator wie Docker Swarm oder Kubernetes verwenden, um mehrere Replikate Ihrer Anwendung auszuführen. Jeder Container würde seinen eigenen Cron-Daemon ausführen, wodurch geplante Tasks mehrmals ausgeführt werden. Dies kann durch die Verwendung von Sperrdateien, die in ein freigegebenes Docker-Volume eingebunden sind, abgeschwächt werden. Nichtsdestotrotz ist es wartungsfreundlicher, das Wurzelproblem anzugehen und einen dedizierten Container für den Cron-Daemon einzuführen.

Im Allgemeinen möchten Sie, dass beide Container auf dem Docker-Image Ihrer Anwendung basieren. Sie benötigen jeweils Verbindungen zu den Docker-Volumes und -Netzwerken Ihres Dienstes. Dadurch wird sichergestellt, dass der Cron-Container eine identische Umgebung wie der Anwendungscontainer hat, mit dem einzigen Unterschied, der der Vordergrundprozess ist.

Werbung

Dies ist keine feste Regel – In einigen Projekten können Ihre geplanten Aufgaben triviale Skripte sein, die unabhängig von Ihrer Codebasis funktionieren. In diesem Fall verwendet der Cron-Container möglicherweise ein minimales Basis-Image und beseitigt Verbindungen zu unnötigen peripheren Ressourcen.

Eine Möglichkeit, einen separaten Cron-Container einzurichten, wäre die Verwendung von docker-compose. Sie würden den Cron-Container als zusätzlichen Service definieren. Sie können das Basis-Image Ihrer Anwendung verwenden und den Eintragsbefehl überschreiben, um den Cron-Daemon zu starten. Die Verwendung von docker-compose vereinfacht auch das Anhängen des Containers an alle erforderlichen freigegebenen Volumes und Netzwerke.

Version: "3"   services: app: image: demo-image:neueste Volumes: – data:/app-data cron: image: demo-image:latest entrypoint: /bin/bash Befehl: ["cron", "-f"] Volumes : – Daten:/App-Daten   Volumen: Daten:

Im obigen Beispiel bedient ein Container unsere Anwendung unter Verwendung des Standardeinstiegspunkts im Image. Stellen Sie sicher, dass dies den Cron-Daemon nicht startet! Der zweite Container überschreibt den Einstiegspunkt des Images, um cron auszuführen. Solange das Image noch Cron installiert und Ihre Crontab konfiguriert hat, können Sie docker-compose up verwenden, um Ihre Anwendung aufzurufen.

Kubernetes Cron-Jobs verwenden< /h2>

Schließen wir uns abschließend ein einfaches Beispiel für die Ausführung geplanter Aufgaben in Kubernetes an. Kubernetes enthält eine eigene CronJob-Ressource, die Sie in Ihren Manifesten verwenden können.

Sie müssen Cron nicht in Ihrem Image installieren oder spezielle Container einrichten, wenn Sie Kubernetes verwenden. Beachten Sie, dass CronJob eine Beta-Ressource ist, die sich in zukünftigen Kubernetes-Versionen ändern kann.

apiVersion: batch/v1beta1 art: CronJob-Metadaten: name: my-cron namespace: my-namespace spec: schedule: "*/5 * * * *” concurrencyPolicy: JobTemplate verbieten: spec: template: spec: container: – name: my-container image: my-image:latest command: ["/bin/bash", "/my-cron-script.sh"] restartPolicy : Bei Fehler

Wenden Sie das obige Manifest auf Ihren Cluster an, um einen neuen Cron-Job zu erstellen, der alle fünf Minuten /my-cron-script.sh in Ihrem Container ausführt. Die Häufigkeit wird als reguläre Cron-Definition dem Zeitplanschlüssel in der Ressourcenspezifikation zugewiesen.

RELATEDSo verwenden Sie Docker zum Containerisieren von PHP und Apache

Sie können die ConcurrencyPolicy anpassen, um zu steuern, ob Kubernetes zulässt, dass sich Ihre Jobs überschneiden. Die Standardeinstellung ist Zulassen, kann aber auf Verbieten (verhindern, dass neue Jobs gestartet werden, während bereits vorhanden sind) oder Ersetzen (beendet einen bestehenden Job, sobald ein neuer beginnt) geändert werden.

Werbung

Kubernetes verwenden& #8217;s integrierte Ressource ist die empfohlene Methode, um geplante Aufgaben in Ihren Clustern zu verwalten. Sie können problemlos auf Jobprotokolle zugreifen und müssen sich nicht darum kümmern, Ihre Container für die Verwendung mit Cron vorzubereiten. Sie müssen nur ein Docker-Image erstellen, das alles enthält, was Ihre Aufgaben zum Ausführen benötigen. Kubernetes übernimmt das Erstellen und Löschen von Containerinstanzen nach dem von Ihnen festgelegten Zeitplan.