2016-05-03 11 views
8

Ich versuchte nurWie ein cron-Job in einem Docker Container laufen

mein Behälter hat cron.daily und cron.weekly Datei

einen cron-Job in einem Docker Container

aber nichts funktioniert für mich zu laufen

crontab, cron.d, namens cron.hourly ... sind in meinem Behälter fehlt

crontab -e arbeitet auch mein Behälter nicht

läuft mit/bin/bash

+0

Haben Sie irgendwelche der Dokumenation oder man-Seiten auf Cron (8), Crontab (1) oder Crontab (5) gelesen? Was lässt dich denken, dass du crontab (1) sowieso brauchst? Sie können Ihre Crontab (5) ohne und nur HUP cron (8) bearbeiten. Erstellen Sie alternativ ein eigenes Bild mit den hinzugefügten Elementen. Da ich mir nicht sicher bin, ob Sie selbst die grundlegendsten Forschungen durchgeführt haben, bin ich nicht geneigt, diese Schritte aufzulisten, abgesehen von dem Hinweis, Dockerfiles zu lesen. – Marakai

Antwort

36

Hier ist, wie ich einen meiner Cron-Container laufen.

Dockerfile:

FROM alpine:3.3 

ADD crontab.txt /crontab.txt 
ADD script.sh /script.sh 
COPY entry.sh /entry.sh 
RUN chmod 755 /script.sh /entry.sh 
RUN /usr/bin/crontab /crontab.txt 

CMD ["/entry.sh"] 

crontab.txt

*/30 * * * * /script.sh >> /var/log/script.log 

entry.sh

#!/bin/sh 

# start cron 
/usr/sbin/crond -f -l 8 

script.sh

#!/bin/sh 

# code goes here. 
echo "This is a script, run by cron!" 

wie

bauen so
docker build -t mycron . 

Run like so

docker run -d mycron 

eigene Skripte hinzufügen und die crontab.txt bearbeiten und nur das Bild und führen bauen. Da es auf alpin basiert, ist das Bild sehr klein.

+0

Thx für die Lösung! Es funktioniert gut für meinen Anwendungsfall. –

+0

Ich kann das nicht genug verbessern. Ich habe so viele verschiedene Möglichkeiten ausprobiert, um Cron in Docker laufen zu lassen, es ist lächerlich. Das Problem ist, dass es keine Ausgabe gibt, wenn etwas schief geht, aber Ihre Lösung führt es korrekt in den Vordergrund und protokolliert die Probleme! Vielen Dank! – Sarke

6

danke für diese Vorlage.

Ich frage mich nur über eine Zeile in entry.sh

/usr/sbin/crond -f -L 8

crond -help ergibt:

Usage: crond -fbS -l N -d N -L LOGFILE -c DIR 

     -f  Foreground 
     -b  Background (default) 
     -S  Log to syslog (default) 
     -l N Set log level. Most verbose:0, default:8 
     -d N Set log level, log to stderr 
     -L FILE Log to FILE 
     -c DIR Cron dir. Default:/var/spool/cron/crontabs 

so vielleicht Sie lieber wollte die kleine l setzen

/usr/sbin/crond -f -l 8

istead des großen ‚L‘

/usr/sbin/crond -f -L 8

die Protokollebene zu setzen, auf dem Standard weil ein Logfile 8 scheint nicht genannt Angabe sollte.

0

crond mit tiny auf Alpine gut funktioniert

RUN apk add --no-cache tini 

ENTRYPOINT ["/sbin/tini", "--"] 
CMD ["/usr/sbin/crond", "-f"] 

sollten aber nicht als Container Hauptprozess (PID 1) wegen der Zombie-Problem und Probleme erntet mit Signalverarbeitung ausgeführt werden. Einzelheiten finden Sie unter this Docker PR und this blog post.

+1

Warum sollte nicht als PID1 ausgeführt werden? –