2015-09-30 30 views
24

ich eine einfache Dockerfile haben alsCron-Job läuft nicht in Docker-Container auf ubuntu

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 

folgt und der Gehalt an crontab Datei ist so einfach wie

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

Als ich das laufen auf meinem lokalen OS X-Maschine (mit Docker-Maschine läuft), es funktioniert gut ("Hallo Welt" wird gedruckt, um jede Minute eine Datei zu protokollieren). 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 verwende, um die Container

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

Ich bin nicht sicher ausgeführt werden, warum dies der Fall wäre. Ich frage mich, ob etwas mit der Ubuntu-Box, die ich habe, nicht stimmt (falsche Zeiteinstellung?). Ich habe versucht, diese Maschine ohne Erfolg neu zu starten. Ich habe derzeit andere Docker-Container auf der Ubuntu-Box laufen und sie laufen gut.

Jeder Vorschlag, was ich tun könnte, um dies zu debuggen/beheben würde sehr geschätzt werden.

EDIT:

im Inneren des Behälters Nachdem man (docker exec -it cron /bin/bash), kann ich, dass cron überprüfen läuft es:

[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 
+0

Ich stimme zu, diese Frage als Off-Topic zu schließen, weil sie auf AskUbuntu gehört. –

+6

@TinyGiant Ich kann verstehen, woher du kommst, aber ich denke, das ist immer noch eine gültige Frage, da es auch Docker betrifft. –

+1

@TriNguyen Hast du das jemals herausgefunden? Ich habe das gleiche Problem und hoffte, eine lange Protokolluntersuchung zu vermeiden, wenn Sie eine Lösung gefunden haben! –

Antwort

27

im Inneren des Behälters installieren rsyslog mit apt-get install rsyslog und starten Sie es mit dem Befehl rsyslogd vor Start Cron mit cron -L15 (maximale Protokollierung). Dann sehen Sie sich die Datei /var/log/syslog im Container an, um die eigene Protokollausgabe des Cron-Daemons zu sehen. Es wird Ihnen sagen, wenn ein Problem beim Parsen Ihrer Crontab aufgetreten ist, und es wird in Ihrem Fall jede Minute einen Eintrag ähnlich dem Folgenden protokollieren, wenn er sich registriert hat und versucht, Ihren Job auszuführen.

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

+2

Ich hatte das gleiche Problem unter Docker Container. Ihre Lösung funktionierte für mich, aber ich musste syslog-Datei unter/var/log (touch/var/log/syslog) erstellen und den Besitzer in syslog ändern: adm (chown syslog: adm/var/log/syslog). Und mit cron, das zu syslog spricht, habe ich folgendes entdeckt:/usr/sbin/cron [2990]: (root) INSECURE MODE (Modus 0600 erwartet) (crontabs/root). Also musste ich den korrekten Berechtigungsmodus 0600 einstellen (chmod 0600/var/spool/cron/crontabs/root). Danach hat alles gut funktioniert. –

1

ich ähnliches Problem hatte, und zwar mit Ubuntu 14.04. Um zu debuggen, habe ich versucht, cron im Vordergrund auszuführen, und habe festgestellt, dass es System error Nachrichten ausgibt, während es versucht, die geplanten Jobs auszuführen.

Offenbar ist es ein bekanntes Problem mit --net=host Parameter (Ref: https://github.com/moby/moby/issues/5899). Ich habe versucht, --pid=host wie vorgeschlagen zu übergeben, und damit begannen die Cron-Jobs gut zu laufen.

0

Ich hatte ein Backup-Skript namens backup.sh, die ich auf /etc/cron.daily kopiert habe. Das Skript wurde nicht ordnungsgemäß aufgerufen.

Um es zu ich machen musste die nur backup ohne .sh

So ls -l /etc/cron.daily für mich umbenennen hatte die 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 zu testen/analysieren diese habe ich Der folgende Ansatz:

Ich suchte die Crontab-Datei cat /etc/crontab mit der folgenden Zeile für die da ily cronjobs:

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

Dann, indem Sie

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

und mit ps auxf hat mir gezeigt, auf einem anderen Terminal, dass die Arbeitsplätze:

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

ich meine Backup-Skript dann in einen speziellen Ordner isoliert jetzt läuft. Sie können auch überprüfen, dass es bricht, wenn auf die .sh Version Umbenennung:

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

Es dann sofort vorhanden ist, so dass kein Auftrag ausgeführt wird.