2017-07-24 1 views
1

Ich bin für die Verwendung von Docker mit Cron übergegangen, aber ich bin mir nicht sicher, ob mein Setup optimal ist. Ich habe einen Cron-Container, der ungefähr 12 verschiedene Skripts ausführt. Ich kann den Zeitplan der Skripte bearbeiten, aber um eine neue Version der Software zu installieren (einige Skripte, die etwa einen halben Tag laufen), muss ich einen neuen Container erstellen, um einige der Skripte auszuführen, während andere fertig sind.Best Practices für Cron auf Docker

Ich überlege, entweder einen Container pro Skript auszuführen (die Container teilen alles im Bild, aber die Crontab). Dies macht es jedoch immer noch schwierig, Updates für mehrere Container zu koordinieren, die denselben Code verwenden.

Die andere Alternative, die ich in Betracht ziehe, ist cron auf dem Host-Rechner laufen und jeder Befehl wäre ein docker run Befehl. Dadurch könnte ich das nächste Laufbild aktualisieren, indem ich eine Umgebungsvariable in crontab verwende.

Hat jemand Erfahrung mit einer dieser beiden Lösungen? Gibt es andere Lösungen, die helfen könnten?

Antwort

1

Wenn Sie nur Docker Standalone (Single Host) ausführen und eine Reihe von Cron-Jobs ausführen müssen, ohne zu viel über ihre Auswirkungen auf den Host nachzudenken, dann funktioniert es einfach, sie auf dem Host auszuführen.

Es würde Sinn machen, sie in Docker auszuführen, wenn Sie von Docker-Funktionen wie Speicher- und CPU-Einschränkungen profitieren (damit sie nichts störend machen). Wenn Sie auch einen Protokolltreiber verwenden, der Containerprotokolle in einen externen Protokolldienst schreibt, können Sie die Aufträge problemlos überwachen. Dies ist ein weiterer guter Grund, dies zu tun. Der letzte (aber offensichtliche) Vorteil ist, dass die Bereitstellung neuer Software mit einem Docker-Image, anstatt sich auf dem Host herumzuschleichen, oft ein Gewinn ist.

Es ist viel sauberer, ein einzelnes Bild zu erstellen, das den gesamten Code enthält, den Sie benötigen. Dann triggern Sie docker run Befehle vom cron-Daemon des Hosts und überschreiben den Befehl/entrepoint. Der Container stirbt dann und löscht sich selbst, nachdem der Job abgeschlossen ist (möglicherweise müssen Sie die Containerausgabe erfassen, um den Host anzumelden, abhängig davon, welcher Protokolltreiber konfiguriert ist). Versuchen Sie nicht, Konfigurationswerte oder Parameter, die Sie häufig ändern, zu senden, damit Sie Ihre Cron-Einstellungen so statisch wie möglich halten. Es kann chaotisch werden, wenn ein neues Image bedeutet, dass Sie Ihre Cron-Daten auf dem Host bearbeiten müssen.

Wenn Sie docker run verwenden, müssen Sie sich keine Sorgen machen, wenn Sie Bilder aktualisieren, während Jobs ausgeführt werden. Stellen Sie sicher, dass Sie sie zum Beispiel mit latest markieren, damit der nächste Job das neue Bild verwendet.

Wenn 12 Container im Hintergrund mit ihrem eigenen Cron-Daemon laufen, verschwendet auch etwas Speicher, aber der schlimmste Teil ist, dass Cron nicht die Umgebungsvariablen aus dem Parent-Prozess verwendet, also wenn Sie config mit env vars eingeben Ich muss diese Unordnung hacken (schreibe ihnen eine Diskette, wenn der Container startet und so).

Wenn Sie sich Sorgen um parallel laufende Jobs machen, gibt es eine Menge Aufgabenplanungsdienste, die Sie verwenden können, aber das könnte für einen einzelnen Docker-Standalone-Host übertrieben sein.