web-dev-qa-db-fra.com

le travail cron ne s'exécute pas à l'intérieur du conteneur Docker sur Ubuntu

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
25
Tri Nguyen

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.

1
Ameya

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é.

0
GameScripting

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
0
Archimedes Trajano