Vous pouvez copier votre crontab dans une image, afin que le conteneur lancé à partir de cette image exécute la tâche.
Voir " Exécuter une tâche cron avec Docker " de Julien Boulay dans son Ekito/docker-cron
:
Créons un nouveau fichier appelé " hello-cron
" pour décrire notre travail.
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# An empty line is required at the end of this file for a valid cron file.
Si vous vous demandez ce qu'est 2>&1, Ayman Hourieh explique .
Le fichier Docker suivant décrit toutes les étapes de la construction de votre image.
FROM ubuntu:latest
MAINTAINER docker@ekito.fr
RUN apt-get update && apt-get -y install cron
# Copy hello-cron file to the cron.d directory
COPY hello-cron /etc/cron.d/hello-cron
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron
# Apply cron job
RUN crontab /etc/cron.d/hello-cron
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# Run the command on container startup
CMD cron && tail -f /var/log/cron.log
(voir Gaafar 's commentaire et Comment puis-je faire apt-get
installer moins bruyant ? :
apt-get -y install -qq --force-yes cron
peut aussi fonctionner)
Comme l'a noté Nathan Lloyd sur les commentaires :
Note rapide à propos d'un gotcha :
Si vous ajoutez un fichier script et que vous demandez à cron de l'exécuter, n'oubliez pas de
RUN chmod 0744 /the_script
Cron échoue silencieusement si vous oubliez .
OU, assurez-vous que votre travail lui-même redirige directement vers stdout/stderr au lieu d'un fichier journal, comme décrit dans hugoShaka 's réponse :
* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2
Remplacez la dernière ligne de Dockerfile par
CMD ["cron", "-f"]
Voir aussi (à propos de cron -f
(c'est-à-dire cron "avant-plan") " docker ubuntu cron -f
ne fonctionne pas "
Construisez et exécutez-la :
sudo docker build --rm -t ekito/cron-example .
sudo docker run -t -i ekito/cron-example
Soyez patient, attendez 2 minutes et votre ligne de commande devrait s'afficher :
Hello world
Hello world
Eric ajoute dans les commentaires :
Notez bien que tail
peut ne pas afficher le bon fichier s'il est créé pendant la construction de l'image.
Si c'est le cas, vous devez créer ou toucher le fichier pendant l'exécution du conteneur pour que tail récupère le bon fichier.
Voir " Sortie de tail -f
à la fin d'un docker CMD
ne montre pas ".
Voir plus dans " Exécution de Cron dans Docker " (avril 2021) de Jason Kulatunga comme il commenté ci-dessous
Voir l'image de Jason AnalogJ/docker-cron
basé sur :