Voici comment j'exécute l'un de mes conteneurs cron.
Fichier Docker :
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!"
Construire comme ça
docker build -t mycron .
Courez comme ça
docker run -d mycron
Ajoutez vos propres scripts et modifiez le crontab.txt, créez simplement l'image et exécutez-la. Puisqu'elle est basée sur alpine, l'image est super petite.
crond fonctionne bien avec Tiny sur Alpine
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["/usr/sbin/crond", "-f"]
mais ne doit pas être exécuté en tant que processus principal du conteneur (PID 1) en raison d'un problème de récolte de zombies et de problèmes de traitement du signal. Voir ce Docker PR et cet article de blog pour plus de détails.
La solution de @ken-cochrane est probablement la meilleure, cependant, il existe également un moyen de le faire sans avoir besoin de créer des fichiers supplémentaires.
Pour le faire sans fichiers supplémentaires :
La solution consiste à définir le cron dans votre entrypoint.sh
fichier.
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
...