Docker Container mit .NET Core Cron App
In diesem Tutorial zeige ich wie man eine über Umgebungsvariablen konfigurierbaren Docker Container mit .NET Core Cron App erstellt. In diesem .NET Programm kann man beliebige Berechnungen regelmäßig nach einem Zeitplan ausführen. Von außen steuern beliebig viele Parameter dessen Verlauf.
Docker Container mit .NET Core Cron App
Auf meiner GitHub Seite findest du einen Fork von einem dotnetcron Projekt. In diesem wird ein Docker Container erstellt in dem eine Cron gesteuerte Log Ausgabe eines .NET Core 2 Programms erzeugt wird. Ich habe dessen Code auf die aktuelle LTS Version .NET Core 3.1 gehoben und verwende diese bereits aktiv in meinem aktuellen Projekt.
Das Programm
Das in dem Projekt angelegte .NET Programm ist nur ein Rumpf, von dem man weg seine eigenes Consolen-Programm implementieren kann. Aktuell gibt das Programm bei jedem zeitgesteuerten Lauf den als Umgebungsvariablen angelegten Ausgabe-String im Log aus:
var consoleSettings = new ConsoleSettings();
configuration.GetSection("Console").Bind(consoleSettings);
Console.WriteLine($“{DateTime.UtcNow}: Output String: ‚{consoleSettings.OutputString}'“);
Soweit ist das nicht sehr spannend. Interessant ist die Konstruktion des Containers.
Docker Container
Um das Projekt am Windows Rechner ausführen zu können brauchst du Docker Desktop. Da ich Linux Container nutze solltest du ebenfalls WSL installiert haben. Aus dem Projektverzeichnis heraus kann man danach aus der Kommandozeile den Container mit:
docker-compose up
bauen und ausführen. Die Konsole schaltet danach sofort in eine interaktive Logausgabe, alternativ findet man die Ausgaben des Programms auch über die Ausgabe von Docker.
in der geöffneten Konsole wird die Ausgabe des durch den Cronjob aufgerufenen Programms nun jede Minute ausgegeben. Dieses Fenster kann man schließen, da der Container über Docker Desktop weiter im Hintergrund läuft. Über das Container Interface lässt sich der Ausgabestream des Containers jederzeit ansehen:
Dockerfile
Abseits des simplen .NET Core Programms ist das Dockerfile der spannendste Teil des Projekts. Dort wird ein Linux Docker Container mit der .NET Laufzeitumgebung angelegt und der Cronjob angelegt. Der von mir verwendete buster-slim (Debian Linux 10!) Container hat Cron nicht installiert. Kein Problem, mit folgenden Anweisungen im Dockerfile lässt sich Cron installieren:
# Install Cron RUN apt-get update -qq && apt-get -y install cron -qq --allow-unauthenticated
wichtig ist der Parameter –allow-unauthenticated damit das Paket ohne Rückfrage an den Benutzer installiert wird. Bei der automatischen Erstellung vom Container gibt es keine Benutzerinteraktion. Die Einrichtung vom Cron habe ich aus dem ursprünglichen Repository übernommen:
# Add export environment variable script and schedule COPY *.sh ./ COPY schedule /etc/cron.d/schedule RUN sed -i 's/\r//' export_env.sh \ && sed -i 's/\r//' run_app.sh \ && sed -i 's/\r//' /etc/cron.d/schedule \ && chmod +x export_env.sh run_app.sh \ && chmod 0644 /etc/cron.d/schedule
Die in schedule angelegte Cron Regel wird verwendet. In meinem Projekt wird dort jede Minute das app/run_app.sh Script aufgerufen. Dieses lässt die .NET Applikation laufen. In weiterer Folge wird das Script für die Umgebungsvariablen (export_env.sh) kopiert und die Ausführungsrechte des Scripts gesetzt. Die eigentliche Ausführung des Containers sieht so aus:
# Run Cron CMD /app/export_env.sh && /usr/sbin/cron && tail -f /var/log/cron.log
Umgebungsvariablen setzen, Cron starten und die Änderungen in der Log Datei in den Ausgabestream schreiben.
Fazit
Ich habe dir eine Vorlage für einen Docker Container mit .NET Core Cron App zur Verfügung gestellt. Damit kannst du sofort loslegen und eine .NET Core 3.1 LTS Consolen Applikation aufziehen. Für neuere Projekte kann man aus dieser Basis auch einen Container mit eines .NET 5 Programms erstellen. Da wir aber von einem Container sprechen der hoffentlich möglichst lange produktiv laufen soll empfehle ich hierfür nur auf LTS Versionen zu setzen (Linux Basis und .NET Laufzeit).