it-swarm.com.de

cron-Job läuft nicht im Docker-Container auf Ubuntu

Ich habe eine einfache Docker-Datei wie folgt

FROM ubuntu:latest

ADD crontab /etc/cron.d/test-cron

RUN chmod a+x /etc/cron.d/test-cron
RUN touch /var/log/cron.log

CMD cron && tail -f /var/log/cron.log

und der Inhalt der crontab-Datei ist so einfach wie

* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
# empty line

Wenn ich dies auf meinem lokalen OS X-Rechner (mit laufendem Docker-Rechner) ausführen, funktioniert es einwandfrei ("Hallo Welt" wird jede Minute in die Protokolldatei gedruckt). Wenn ich jedoch versuche, es auf einem Ubuntu-Computer auszuführen, wird der Cron-Job nicht ausgeführt (leere Protokolldatei). 

Hier ist der Befehl, den ich zum Ausführen des Containers verwende

docker build -t crontest .
docker run --name cron crontest

Ich bin nicht sicher, warum dies der Fall sein würde. Ich frage mich, ob etwas mit der Ubuntu-Box falsch ist, die ich habe (falsche Zeiteinstellung?). Ich habe versucht, diese Maschine ohne Neustart neu zu starten. Ich habe derzeit andere Docker-Container auf der Ubuntu-Box und sie laufen einwandfrei.

Jeder Vorschlag, was ich tun könnte, um dies zu beheben, wäre sehr zu begrüßen.

BEARBEITEN:

Nachdem ich in den Container (docker exec -it cron /bin/bash) gegangen bin, kann ich überprüfen, ob dort cron läuft:

[email protected]:/# ps -ef | grep cron
root         1     0  0 20:15 ?        00:00:00 /bin/sh -c cron && tail -f /var/log/cron.log
root         6     1  0 20:15 ?        00:00:00 cron
root         7     1  0 20:15 ?        00:00:00 tail -f /var/log/cron.log
root        25    11  0 20:21 ?        00:00:00 grep --color=auto cron
25
Tri Nguyen

Installieren Sie rsyslog mit apt-get install rsyslog Im Container und starten Sie es mit dem Befehl rsyslogd, bevor Sie cron mit cron -L15 Starten (maximale Protokollierung). Sehen Sie sich dann die Datei /var/log/syslog Im Container an, um die eigene Protokollausgabe des Cron-Daemons zu sehen. Es wird Ihnen mitgeteilt, ob beim Parsen Ihrer Crontab ein Problem aufgetreten ist, und in Ihrem Fall wird jede Minute ein Eintrag protokolliert, der dem folgenden ähnelt, wenn er registriert wurde und versucht, Ihren Job auszuführen.

CRON[16]: (root) CMD (echo "Hello world" >> /var/log/cron.log 2>&1)

34
Dzamo Norton

Ich hatte ein ähnliches Problem, insbesondere mit Ubuntu 14.04. Zum Debuggen habe ich versucht, cron im Vordergrund auszuführen und fand heraus, dass System error-Meldungen ausgegeben wurden, während die geplanten Jobs ausgeführt wurden.

Anscheinend ist es ein bekanntes Problem mit dem --net=Host-Parameter (ref: https://github.com/moby/moby/issues/5899 ). Ich habe versucht, --pid=Host wie vorgeschlagen zu übergeben, und damit liefen die Cron-Jobs einwandfrei.

1
Ameya

Ich besaß ein Sicherungsskript mit dem Namen backup.sh, das ich in /etc/cron.daily..__ kopierte. Das Skript wurde nicht richtig aufgerufen.

Um es zu machen, musste ich nur in backup umbenennen ohne den .sh

Für mich hatte ls -l /etc/cron.daily folgende Ausgabe:

[email protected]:/# ls -l /etc/cron.daily
total 24
-rwxr-xr-x 1 root root 1474 Sep 13 16:47 apt-compat
-rwxrwxr-x 1 root root   45 Nov  9 11:18 dobackup
-rwxr-xr-x 1 root root 1597 Feb 22  2017 dpkg
-rwxr-xr-x 1 root root 4125 Mar  2  2016 exim4-base
-rwxr-xr-x 1 root root  249 May 17 11:59 passwd

Um dies zu testen/zu analysieren, habe ich den folgenden Ansatz verwendet:

Ich habe die Crontab-Datei cat /etc/crontab nachgeschlagen und die folgende Zeile für die täglichen Cronjobs angezeigt:

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

Dann habe ich mein Backup-Skript in einem eigenen Ordner isoliert:

mkdir /etc/cron.test
mv /etc/cron.daily/dobackup /etc/cron.test

Dann durch Laufen

test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.test)

die Verwendung von ps auxf auf einem anderen Terminal zeigte mir, dass die Jobs jetzt ausgeführt werden. Sie können auch überprüfen, ob es beim Umbenennen in die .sh-Version fehlerhaft ist:

mv /etc/cron.test/dobackup /etc/cron.test/dobackup.sh
test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.test)

Es ist dann sofort vorhanden, sodass kein Job ausgeführt wird.

0
GameScripting

In meinem Fall, wenn ich eine COPY-Datei erstellt habe, wurde eine sekundäre harte Verbindung erstellt (dies kann eine Windows-Sache sein).

Ich musste sicherstellen, dass die Datei in einem laufenden Container erstellt wurde.

FROM mysql:5.7
RUN apt-get update && apt-get install -y anacron
COPY crontab /tmp/crontab

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Run the command on container startup
CMD (cat /tmp/crontab > /etc/cron.d/hello-cron ) && cron && tail -f /var/log/cron.log
0

Es wurde kürzlich in Debian behoben: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=726661 und in Ubuntu Wily (15.10).

Als Workaround können Sie versuchen, das Modul pam_loginuid.so in /etc/pam.d/cron zu kommentieren und cron (oder den Docker-Container) neu zu starten.

0