Warum nicht den cron-Dienst im Dockerfile laufen?
Während Suche für dieses Problem fand ich, dass: cron -f
sollte den Dienst zu starten.
Also ich habe:
RUN apt-get install -qq -y git cron
Als Nächstes habe ich:
CMD cron -f && crontab -l > pullCron && echo "* * * * * git -C ${HOMEDIR} pull" >> pullCron && crontab pullCron && rm pullCron
Meine dockerfile setzt ohne Fehler, aber der cron läuft nicht. Was kann ich tun, um starten Sie den cron-Dienst mit einer zusätzlichen Zeile?
PS:
Ich weiß, dass die git-Funktion in meinem cron sollte eigentlich ein Haken sein, aber für mich (und wahrscheinlich auch für andere) dies ist über das lernen, wie zu setzen crons mit Docker 🙂
PPS:
Komplette Dockerfile (AKTUALISIERT):
RUN apt-get update && apt-get upgrade -y
RUN mkdir -p /var/log/supervisor
RUN apt-get install -qq -y nginx git supervisor cron wget
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN wget -O ./supervisord.conf https://raw.githubusercontent.com/..../supervisord.conf
RUN mv ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN apt-get install software-properties-common -y && apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449 && add-apt-repository 'deb http://dl.hhvm.com/ubuntu utopic main' && apt-get update && apt-get install hhvm -y
RUN cd ${HOMEDIR} && git clone ${GITDIR} && mv ./tybalt/* ./&& rm -r ./tybalt && git init
RUN echo "* * * * * 'cd ${HOMEDIR} && /usr/bin/git pull origin master'" >> pullCron && crontab pullCron && rm pullCron
EXPOSE 80
CMD ["/usr/bin/supervisord"]
PPP:
Supervisord.conf:
[supervisord]
autostart=true
autorestart=true
nodaemon=true
[program:nginx]
command=/usr/sbin/nginx -c /etc/nginx/nginx.conf
[program:cron]
command = cron -f -L 15
autostart=true
autorestart=true
- Duplikat zu : stackoverflow.com/questions/20545554/...
- Hi @Armand, ich habe diese Antwort, aber ich verstehe nicht, wie es ein Duplikat? Das war eigentlich die Frage, die mich hinzufügen
cron -f
fügen Sie am Ende derCMD
aber das scheint nicht zu laufen - Andockfenster initiiert eine Instanz mit einem einzigen Prozess. Können Sie erläutern, wie in dem Befehl, den Sie begonnen, Sie Beispiel mit? Was ich gelernt habe, ist, dass, wenn Sie mehr Prozesse laufen, sollten Sie überlegen, läuft Betreuer von der Befehlszeile aus und machen es verantwortlich für die Aktivierung der system-Prozesse, die Sie wünschen, zur Verfügung zu haben.
- bitte siehe mein update
- hmm, ich bin traurig über meine doppelte Nachricht, cron -f sollte in der Tat funktionieren. was bekommen Sie, beim ausführen von "docker logs CONTAINER" ? ich bin curiouse wenn der cron ist das schreiben etwas in den syslog.
- nicht Ihre zweite CMD überschreibt Ihre erste?
- Aha, danke @xuhdev das macht Sinn, ich werde überprüfen Sie es heraus und erhalten zurück zu Ihnen so bald wie möglich.
- Ich habe aktualisiert mein dockerfile mit supervisord, setzt es gut, aber der cron läuft nicht, irgendwelche Gedanken? (siehe mein update PPS in Frage) Thx
- Ich weiß nicht wirklich nutzen supervisord. Ich würde vorschlagen, Sie zu cron und nginx in zwei Behälter und verwenden Sie einen Daten-container zum Austausch von Daten zwischen Ihnen. Es ist leichter zu pflegen und in vielen Fällen einfacher zu Debuggen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Angefangen crond mit Vorgesetzten, Ihre cron-jobs ausgeführt werden soll. Hier sind die Schritte zur Problembehandlung Sie ergreifen können, um sicherzustellen, dass cron ausgeführt wird
Ist der cron-daemon ausgeführt, der im container? Login zum container und führen
ps a | grep cron
zu finden. Verwendendocker exec -ti CONTAINERID /bin/bash
für die Anmeldung der container.Ist supervisord laufen?
ubuntu:14.04
. Ich habeCMD ["/usr/bin/supervisord"]
im Dockerfile.Versuchen Sie einen anderen einfachen cron-job zu findout, ob das problem in Ihre cron-Eintrag oder den cron-daemon. Fügen Sie diese, wenn Sie angemeldet sind, um den container mit
crontab -e
:* * * * * echo "hi there" >> /tmp/test
Überprüfen Sie den container Protokolle für weitere Informationen über cron:
docker logs CONTAINERID | grep -i cron
Dies sind nur ein paar Tipps zur Problembehandlung Sie Folgen können.
Cron wird nicht ausgeführt, da nur die letzten
CMD
überschreibt den ersten (wie @xuhdev gesagt). Es ist hier dokumentiert : https://docs.docker.com/reference/builder/#cmd.Wenn Sie wollen, um
nginx
undcron
laufen in den gleichen container Sie benötigen, um irgendeine Art von Vorgesetzten (wiesupervisord
oder andere), wird die pid 1 Prozess des Behälters und verwalten der chield Prozesse. Ich denke, dass dieses Projekt helfen : https://github.com/nbraquart/docker-nginx-php5-cron (es scheint zu tun, was Sie zu erreichen versuchen).Je nachdem, was du bist cron hier ist, dort wäre die andere Lösung, die — wie der Bau eines neuen Bildes für jede commit-oder jedes tags, etc...
CMD ["/usr/bin/supervisord"]
zuCMD ["/usr/bin/supervisord", "-n"]
Ich habe diese verwendet werden, mit CentOS und es funktioniert:
Den rest meines Dockerfile nur yum installiert cronie und berührt die
/var/log/cron
- Datei, damit es dort sein wird, wenn die CMD ausgeführt wird.Auf centos 7, das funktioniert für mich
-n ist für den Vordergrund
-s-log an stdout und stderr