Pour commencer, j'ai référencé ces deux articles pour obtenir de l'aide:
Mon objectif est de faire démarrer automatiquement un travail cron lorsque je lance mon conteneur Docker. Actuellement, cela ne démarre pas automatiquement, mais je peux aller manuellement dans mon conteneur et exécuter service cron start
, ce qui démarre le travail et il fonctionne correctement.
Le problème est donc le suivant: Comment puis-je obtenir le démarrage automatique de ma tâche cron au démarrage de mon conteneur?
Dockerfile
FROM Microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron
COPY . /app
WORKDIR /app
ADD crontab /etc/cron.d/crontab
RUN chmod 0600 /etc/cron.d/crontab
RUN crontab -u root /etc/cron.d/crontab
RUN touch /var/log/cron.log
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
CMD cron && tail -f /var/log/cron.log
CMD service cron start
crontab
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# Empty space
Bien que je ne sois pas parvenu à faire fonctionner cron dans ce conteneur particulier, j'ai pu créer un conteneur docker autonome spécifiquement pour cron et j'ai réussi à le faire fonctionner automatiquement.
En ce qui concerne la configuration du conteneur cron, j’ai suivi l’article lié, Exécuter un travail cron avec Docker - Julien Boulay , et j’ai réussi à le faire fonctionner.
Ce que je fais est d'avoir l'appel CMD cron directement comme ceci:
CMD /usr/sbin/cron -f
Avant cela, j'ajoutais la crontab au conteneur et l'attribuais en tant que crontab racine avec la commande:
RUN crontab /root/mycrontab
Vous n'avez pas besoin d'appeler la commande crontab sur les fichiers situés dans /etc/cron.d
, mais vous avez besoin de la syntaxe correcte pour ces fichiers. En utilisant votre exemple, au lieu de ceci:
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
Vous devriez avoir ceci:
* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
Sur votre fichier crontab. Ceci s'applique uniquement aux fichiers crontab situés dans /etc/cron.d
, sinon la syntaxe de votre fichier crontab est correcte et vous utilisez la commande crontab
pour le charger.
À partir de votre exemple, je pense que vous devriez modifier vos fichiers comme suit:
Dockerfile
FROM Microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron
COPY . /app
WORKDIR /app
ADD crontab /etc/cron.d/crontab
RUN chmod 0600 /etc/cron.d/crontab
RUN touch /var/log/cron.log
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
CMD /usr/sbin/cron -f
crontab
* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
Une autre alternative serait:
Dockerfile
FROM Microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron
COPY . /app
WORKDIR /app
ADD crontab /root/
RUN crontab /root/crontab
RUN touch /var/log/cron.log
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
CMD /usr/sbin/cron -f
crontab
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
Il existe un bogue dans les distributions basées sur Debian qui peut entraîner l’échec de cronjobs car docker utilise un système de fichiers en couches et que cron ne démarre pas et indique NUMBER OF HARD LINKS > 1 (/etc/crontab)
.
Le correctif est simple, ajoutez touch /etc/crontab /etc/cron.*/*
au point d'entrée de votre conteneur.
J'ai publié un article de blog expliquant comment installer cron dans un conteneur Docker ici: https://digitz.org/blog/cron-jobs-in-docker/
Nous avons eu un problème avec php-fpm et docker où nos tâches cronjob n’ont pas été exécutées. Nous avons résolu deux problèmes:
crontab
dans le conteneur de menu fixe en utilisant COPY config/custom-cron /etc/cron.d/custom-cron
. Le problème est que nos fins de ligne étaient au format windows. Cela a cassé notre fichier crontab, car cette ligne endigs ne sont pas convertis lors de la copie de ce fichier dans le conteneur. CMD ["cron", "-f"]
, ce qui a bloqué le processus principal php-fpm
. Cela entraîne une erreur 502 Bad gateway
lors de l'appel de notre application Web. Enfin, nous avons réussi à faire fonctionner le fichier crontab manuellement en construisant l’image du menu fixe au lieu du copier-coller et de l’utilisation de Supervord pour exécuter plusieurs tâches dans le menu fixe. Cela devrait fonctionner sur tous les systèmes d'exploitation pris en charge.
FROM php:7.1.16-fpm
RUN apt-get update && apt-get install -y cron supervisor
# Configure cron
RUN crontab -l | { cat; echo "* * * * * echo 'Hello world' >> /var/log/cron-test.log 2>&1"; } | crontab -
# Configure supervisor
COPY config/supervisord.conf /etc/supervisor/supervisord.conf
[supervisord]
logfile = /dev/null
loglevel = info
pidfile = /var/run/supervisord.pid
nodaemon = true
[program:php-fpm]
command = php-fpm
autostart = true
autorestart = true
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes = 0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0
[program:cron]
command = cron -f
autostart = true
autorestart = true
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes = 0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes = 0