webentwicklung-frage-antwort-db.com.de

Cron läuft nicht, wenn ich meinen Docker-Container starte

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.

9
Tory

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
9
Alvaro Carvajal

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/

1
Root

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:

  • Wir haben versucht, eine 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. 
  • Das zweite Problem war, dass wir versucht haben, den cron über 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. 

dockerfile

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.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
0
lin

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
0
Frighten