J'ai essayé d'exécuter un travail cron dans un conteneur docker
mais rien ne fonctionne pour moi
mon conteneur n'a que les fichiers cron.daily et cron.weekly
crontab, cron.d, cron.hourly ... sont absents dans mon conteneur
crontab -e ne fonctionne pas non plus
mon conteneur fonctionne avec/bin/bash
Voici comment j'exécute l'un de mes conteneurs 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!"
Construisez comme ça
docker build -t mycron .
Courez comme ça
docker run -d mycron
Ajoutez vos propres scripts et éditez le crontab.txt et créez simplement l'image et exécutez. Puisqu'il est basé sur Alpine, l'image est super petite.
merci pour ce modèle.
Je me demande seulement une ligne dans entry.sh
/usr/sbin/crond -f -L 8
crond -help donne:
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
alors peut-être que vous vouliez plutôt mettre le petit l
/usr/sbin/crond -f -l 8
istead du grand "L"
/usr/sbin/crond -f -L 8
pour définir le niveau de journal par défaut, car en spécifiant un fichier journal appelé 8
ne semble pas être destiné.
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 de conteneur (PID 1) en raison d'un problème de récolte de zombies et de problèmes de gestion du signal. Voir ce Docker PR et ce billet de blog pour plus de détails.