Cron Container für Docker - wie funktionieren sie eigentlich?

8

Ich verwende docker seit einigen Monaten und arbeite daran, verschiedene Serverbilder zu docken. Ein konsistentes Problem ist, dass viele Server Cron-Jobs ausführen müssen. Es gibt eine Menge Diskussionen darüber online (einschließlich Stackoverflow), aber ich verstehe die Mechanik davon nicht vollständig.

Zur Zeit verwende ich die Cron- und Docker-Exec des Hosts in jedem Container, um ein Skript auszuführen. Ich habe eine Konvention über den Namen und den Ort des Skripts erstellt. Alle meine Container haben das gleiche Skript. Dadurch wird vermieden, dass der Cron des Hosts von den Containern abhängt.

Im Prinzip, einmal pro Minute, macht der Cron des Hosts folgendes:

%Vor%

Das funktioniert, aber macht die Container vom Host abhängig.

Ich möchte einen Cron-Container erstellen, der in jedem der anderen Container ein Skript startet - aber mir ist nichts von einem "Docker-Exec" bekannt, das von einem Container zum anderen funktioniert.

Die spezifischen Situationen, die ich gerade habe, führen eine Sicherung in einem MySQL-Container aus und führen die Cron-Jobs aus, die Moodle benötigt, um jede Minute ausgeführt zu werden. Irgendwann wird es noch weitere Dinge geben, die ich über Cron erledigen muss. Moodle verwendet Kommandozeilen-PHP-Skripte.

Was ist der "richtige" dockerisierte Weg, um ein Skript von einem Container in einem anderen Container zu starten?

Update : Vielleicht hilft es, meine speziellen Anwendungsfälle zu erwähnen, obwohl es im Laufe der Zeit noch mehr geben wird.

Cron muss derzeit Folgendes tun:

  • Führen Sie einen Datenbank-Dump von MySQL aus. Ich kann das über mysqldump TCP-Link von einem Cron-Container aus tun; Der Nachteil hierbei ist, dass ich den Backup-Benutzer nicht auf Host 127.0.0.1 beschränken kann. Ich könnte auch in der Lage sein, den MySQL-Socket über ein Volume irgendwie in den Cron-Container zu befördern.
  • Führen Sie regelmäßige Wartungsarbeiten an einer Moodle-Installation durch. Moodle enthält ein PHP-Befehlszeilenskript, das alle Wartungsaufgaben ausführt. Das ist das große Problem für mich. Ich kann wahrscheinlich dieses Skript über ein Volume ausführen, aber Moodle wurde nicht mit dieser Situation entworfen, und ich würde die Race-Bedingungen nicht ausschließen. Außerdem möchte ich meine Moodle-Installation nicht in einem Volume, da dies das Aktualisieren des Containers erheblich erschwert (bedenke, dass Volumes in Docker nicht neu initialisiert werden, wenn du den Container mit einem neuen Image aktualisierst).
  • Zukünftig: Führen Sie routinemäßige Wartungsarbeiten an einer Reihe anderer Server durch, z. B. zum Löschen von E-Mail-Warteschlangen usw.
Kevin Keane 21.11.2015, 18:28
quelle

1 Antwort

7

Meine Lösung ist:

  • crond im Container installieren
  • installiere deine Software
  • führe Cron als Daemon aus
  • run Your soft

Teil meiner Dockerfile

%Vor%

Beschreibung

  1. Stellen Sie die Zeitzone ein, da cron dies für die Ausführung von Aufgaben benötigt
  2. Installieren Sie cron Paket - Paket mit Cron-Daemon
  3. Installieren Sie rsyslog package, um die Cron-Task-Ausgabe zu protokollieren
  4. Installieren Sie mailutils package, wenn Sie E-Mails von Cron-Aufgaben senden möchten
  5. Ausführen rsyslogd
  6. Kopieren Sie die ENV-Variablen in die tmp-Datei, da Cron Tasks mit minimalen ENV- und Sie-Tasks möglicherweise auf ENV-Variablen in Containern
  7. ausführen muss
  8. Fügen Sie Ihre .crontab -Datei (mit Ihren Aufgaben) in die tmp-Datei
  9. ein
  10. Setzen Sie root crontab aus der tmp-Datei
  11. Führen Sie den Cron-Daemon
  12. aus

Ich benutze das in meinen Behältern und arbeite sehr gut.

Ein-Prozess-pro-Container

Wenn Sie dieses Paradigma mögen, dann machen Sie eine Dockerfile pro Cron-Aufgabe. z.B.

  • Dockerfile - Hauptprogramm
  • Dockerfile_cron_task_1 - Cron-Task 1
  • Dockerfile_cron_task_1 - Cron-Task 2

und alle Container erstellen:

%Vor%     
Tomasz Jakub Rup 21.11.2015 21:59
quelle

Tags und Links