Zum Vorwort habe ich auf diese beiden Artikel als Hilfe verwiesen:
Mein Ziel ist es, einen Cron-Job automatisch zu starten, wenn ich meinen Docker-Container starte. Derzeit wird es nicht automatisch gestartet, aber ich kann manuell in meinen Container gehen und service cron start
ausführen, wodurch der Job gestartet wird und ordnungsgemäß funktioniert.
Das Problem ist also: Wie kann ich erreichen, dass mein Cron-Job automatisch startet, wenn mein Container startet?
Dockerfile
FROM Microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron
COPY . /app
WORKDIR /app
ADD crontab /etc/cron.d/crontab
RUN chmod 0600 /etc/cron.d/crontab
RUN crontab -u root /etc/cron.d/crontab
RUN touch /var/log/cron.log
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
CMD cron && tail -f /var/log/cron.log
CMD service cron start
crontab
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# Empty space
Obwohl ich nicht in der Lage war, cron in diesem speziellen Container zum Laufen zu bringen, war es mir möglich, einen eigenständigen Docker-Container speziell für cron zu erstellen, und es gelang mir, diesen automatisch auszuführen.
Was das Setup für den Cron-Container anbelangt, folgte ich dem verlinkten Artikel Einen Cron-Job mit Docker-Julien Boulay ausführen und konnte ihn zum Laufen bringen.
Was ich mache ist, dass der CMD-Aufruf direkt so ist:
CMD /usr/sbin/cron -f
Vorher füge ich die Crontab dem Container hinzu und weise sie mit dem Befehl als Root-Crontab zu:
RUN crontab /root/mycrontab
Sie müssen den Befehl crontab nicht für Dateien aufrufen, die sich in /etc/cron.d
befinden, aber diese Dateien benötigen die korrekte Syntax. Verwenden Sie stattdessen dieses Beispiel:
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
Sie sollten dies haben:
* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
Auf Ihrer Crontab-Datei. Dies gilt nur für Crontab-Dateien, die sich in /etc/cron.d
befinden. Andernfalls ist Ihre Crontab-Dateisyntax korrekt, und Sie laden sie mit dem Befehl crontab
.
Ausgehend von Ihrem Beispiel sollten Sie Ihre Dateien wie folgt ändern:
Dockerfile
FROM Microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron
COPY . /app
WORKDIR /app
ADD crontab /etc/cron.d/crontab
RUN chmod 0600 /etc/cron.d/crontab
RUN touch /var/log/cron.log
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
CMD /usr/sbin/cron -f
crontab
* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
Eine andere Alternative wäre:
Dockerfile
FROM Microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron
COPY . /app
WORKDIR /app
ADD crontab /root/
RUN crontab /root/crontab
RUN touch /var/log/cron.log
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
CMD /usr/sbin/cron -f
crontab
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
Es gibt einen Fehler in Debian-basierten Distributionen, der dazu führt, dass Cronjobs fehlschlagen, weil das Docker-Dateisystem mehrschichtig ist und Cron nicht gestartet wird und NUMBER OF HARD LINKS > 1 (/etc/crontab)
sagt.
Das Update ist einfach, fügen Sie touch /etc/crontab /etc/cron.*/*
zum Eingangspunkt Ihres Containers hinzu.
Ich habe hier einen Blog-Post geschrieben, in dem erklärt wird, wie man cron in einem Docker-Container einrichtet: https://digitz.org/blog/cron-jobs-in-docker/
Wir hatten ein Problem mit php-fpm und Docker, wo unsere Cronjob-Aufgaben nicht ausgeführt wurden. Es gab zwei Probleme, die wir gelöst haben:
crontab
-Datei mit COPY config/custom-cron /etc/cron.d/custom-cron
in den Docker-Container zu kopieren. Das Problem ist, dass unsere Zeilenenden im windows -Format waren. Dies hat unsere Crontab-Datei beschädigt, da diese Zeilenenden nicht konvertiert werden, während diese Datei in den Container kopiert wird. CMD ["cron", "-f"]
zu starten, wodurch der Hauptprozess php-fpm
blockiert wurde. Dies führt beim Aufruf unserer Webanwendung zu einem 502 Bad gateway
-Fehler. Schließlich haben wir es geschafft, indem wir die crontab-Datei manuell bearbeitet haben, während das Docker-Image erstellt wurde, anstatt ein Kopieren und Einfügen vorzunehmen, und Supervisord verwendet wurde, um mehrere Aufgaben im Docker auszuführen. Dies sollte auf allen unterstützten Betriebssystemen funktionieren.
FROM php:7.1.16-fpm
RUN apt-get update && apt-get install -y cron supervisor
# Configure cron
RUN crontab -l | { cat; echo "* * * * * echo 'Hello world' >> /var/log/cron-test.log 2>&1"; } | crontab -
# Configure supervisor
COPY config/supervisord.conf /etc/supervisor/supervisord.conf
[supervisord]
logfile = /dev/null
loglevel = info
pidfile = /var/run/supervisord.pid
nodaemon = true
[program:php-fpm]
command = php-fpm
autostart = true
autorestart = true
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes = 0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0
[program:cron]
command = cron -f
autostart = true
autorestart = true
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes = 0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0
Ich weiß, dass dies eine alte Frage ist, aber ich habe bei Debian eine Lösung dafür gefunden und mein Problem gelöst. Cron pam auth with uid hat meinen Cron vom Laufen abgehalten.
RUN sed -i '/session required pam_loginuid.so/c\#session required pam_loginuid.so/' /etc/pam.d/cron