web-dev-qa-db-fra.com

Cron ne fonctionne pas au démarrage de mon conteneur Docker

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.

9
Tory

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
9
Alvaro Carvajal

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/

1
Root

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:

  • Nous avons essayé de copier un fichier 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. 
  • Le deuxième problème était que nous avons essayé de démarrer le cron via 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. 

dockerfile

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.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
0
lin