J'ai un fichier Dockerfile simple comme suit
FROM ubuntu:latest
ADD crontab /etc/cron.d/test-cron
RUN chmod a+x /etc/cron.d/test-cron
RUN touch /var/log/cron.log
CMD cron && tail -f /var/log/cron.log
et le contenu du fichier crontab
est aussi simple que
* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
# empty line
Lorsque je lance ceci sur ma machine OS X locale (avec docker-machine en cours d'exécution), cela fonctionne correctement ("Hello world" est imprimé pour enregistrer le fichier toutes les minutes). Cependant, lorsque j'essaie de l'exécuter sur une machine Ubuntu, le travail cron ne s'exécute pas (fichier journal vide).
Voici la commande que j'utilise pour exécuter le conteneur
docker build -t crontest .
docker run --name cron crontest
Je ne sais pas pourquoi cela serait le cas. Je me demande si quelque chose ne va pas dans la boîte Ubuntu que j'ai (mauvais réglage de l'heure?). J'ai essayé de redémarrer cette machine sans aucun effet. À l'heure actuelle, d'autres conteneurs Docker s'exécutent sur la machine Ubuntu et ils fonctionnent bien.
Toute suggestion sur ce que je pourrais faire pour résoudre ce problème serait très appréciée.
MODIFIER:
Après être entré dans le conteneur (docker exec -it cron /bin/bash
), je peux vérifier que cron y est exécuté:
root@a2ad451af8d9:/# ps -ef | grep cron
root 1 0 0 20:15 ? 00:00:00 /bin/sh -c cron && tail -f /var/log/cron.log
root 6 1 0 20:15 ? 00:00:00 cron
root 7 1 0 20:15 ? 00:00:00 tail -f /var/log/cron.log
root 25 11 0 20:21 ? 00:00:00 grep --color=auto cron
J'ai eu un problème similaire, en particulier avec Ubuntu 14.04. Pour déboguer, j’ai essayé d’exécuter cron au premier plan et j’ai trouvé qu’il émettait des messages System error
lors de la tentative d’exécution des travaux planifiés.
Apparemment, c'est un problème connu avec le paramètre --net=Host
(ref: https://github.com/moby/moby/issues/5899 ). J'ai essayé de passer --pid=Host
comme suggéré, et avec cela, les tâches cron ont commencé à fonctionner correctement.
J'avais un script de sauvegarde appelé backup.sh
que j'ai copié dans /etc/cron.daily
. Le script n'a pas été appelé correctement.
Pour le faire, je devais renommer le simplement backup
sans le .sh
Donc pour moi ls -l /etc/cron.daily
avait la sortie suivante:
root@0989a35b8f94:/# ls -l /etc/cron.daily
total 24
-rwxr-xr-x 1 root root 1474 Sep 13 16:47 apt-compat
-rwxrwxr-x 1 root root 45 Nov 9 11:18 dobackup
-rwxr-xr-x 1 root root 1597 Feb 22 2017 dpkg
-rwxr-xr-x 1 root root 4125 Mar 2 2016 exim4-base
-rwxr-xr-x 1 root root 249 May 17 11:59 passwd
Pour tester/analyser cela, j'ai utilisé l'approche suivante:
J'ai regardé le fichier crontab cat /etc/crontab
affichant la ligne suivante pour les tâches quotidiennes:
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
J'ai ensuite isolé mon script de sauvegarde dans un dossier dédié:
mkdir /etc/cron.test
mv /etc/cron.daily/dobackup /etc/cron.test
Puis en courant
test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.test)
et l'utilisation de ps auxf
sur un autre terminal m'a montré que les tâches sont en cours d'exécution. Vous pouvez également vérifier qu'il se casse lors du changement de nom de la version .sh
:
mv /etc/cron.test/dobackup /etc/cron.test/dobackup.sh
test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.test)
Il existe alors immédiatement et aucun travail n'est exécuté.
Dans mon cas, lorsque je COPY
un fichier, il créait un lien physique secondaire (il s’agissait peut-être de Windows).
Ce que je devais faire était de m'assurer que le fichier avait été créé dans un conteneur en cours d'exécution.
FROM mysql:5.7
RUN apt-get update && apt-get install -y anacron
COPY crontab /tmp/crontab
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# Run the command on container startup
CMD (cat /tmp/crontab > /etc/cron.d/hello-cron ) && cron && tail -f /var/log/cron.log