Ecco come eseguo uno dei miei contenitori cron.
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!"
Costruisci così
docker build -t mycron .
Corri così
docker run -d mycron
Aggiungi i tuoi script e modifica crontab.txt e costruisci l'immagine ed esegui. Dal momento che è basato su alpine, l'immagine è super piccola.
crond funziona bene con tiny su Alpine
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["/usr/sbin/crond", "-f"]
ma non dovrebbe essere eseguito come processo principale del contenitore (PID 1) a causa di problemi di raccolta di zombi e problemi con la gestione del segnale. Vedi questo Docker PR e questo post sul blog per i dettagli.
La soluzione di @ken-cochrane è probabilmente la migliore, tuttavia esiste anche un modo per farlo senza dover creare file aggiuntivi.
Per farlo senza file aggiuntivi:
La strada da percorrere è impostare il cron all'interno del tuo entrypoint.sh
file.
Dockerfile
...
# Your Dockerfile above
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
echo "* * * * * echo 'I love running my crons'" >> /etc/crontabs/root
crond -l 2 -f > /dev/stdout 2> /dev/stderr &
# You can put the rest of your entrypoint.sh below this line
...