Problèmes de fonctionnement de cron dans Docker sur différents serveurs

J'essaie d'obtenir un conteneur docker pour gérer mes cronjobs

j'exécute un test de cron très simple dans un conteneur docker en utilisant la base centOS 6.5

* * * * * /bin/echo "it works!" >> test.log

cela fonctionne très bien si le conteneur tourne sur CoreOS host, cependant si je tourne le conteneur sur ubuntu 13.10 host le cron n'est pas exécuté. (J'ai bien l'hôte n'a pas d'effet, ce qui était en cours d'exécution dans le conteneur)

les deux hôtes exécutent docker 0.8

suis-je raté quelque chose d'évident, ou c'est un insecte?

merci

24
demandé sur dwitz 2014-02-21 10:00:37

4 réponses

réponse courte

ajouter cette ligne à votre fichier dockerfile

RUN sed -i '/session    required   pam_loginuid.so/c\#session    required   pam_loginuid.so' /etc/pam.d/crond

la réponse longue

d'après ce que j'ai compris, la question est liée aux différences dans le noyau entre CoreOS et Unbutu. cette situation entraîne à son tour un problème de sécurité pour pam.

pour le comprendre, notre premier besoin était d'activer la journalisation pour cron (puisque nous sommes dans le démarrage normal du docker n'est pas exécuté). exécutez

service rsyslog start
service crond restart

le journal cron avait cette erreur (situé ici: /var/log/cron)

FAILED to open PAM security session (Cannot make/remove an entry for the specified session)

alors j'ai regardé le journal de sécurité, et il y avait cette erreur (localisée ici /var/log/secure)

pam_loginuid(crond:session): set_loginuid failed

un peu plus de googling et j'ai trouvé que j'avais besoin de modifier ma configuration pam cond (trouvé ici /etc/pam.d / crond) éditer ce fichier et ajoutez la ligne suivante

#session    required   pam_loginuid.so

redémarrer crond et tout devrait être bon

43
répondu dwitz 2014-02-21 08:15:42

les conteneurs Docker de base ne démarrent pas des services comme cron - ils ne démarrent que ce que vous spécifiez dans L'ENTRYPOINT / CMD

certains conteneurs "plus gros" utilisent des choses comme supervisord pour lancer des services - mais là où c'est possible, il est plus facile de séparer les services en conteneurs différents et de partager les données en utilisant des conteneurs de volume, ou --link

1
répondu SvenDowideit 2014-02-21 07:50:24

la réponse de@dwitz est correcte mais j'ai dû modifier le sed commande un peu pour le faire fonctionner pour moi sur Ubuntu 16.04 à l'intérieur d'un conteneur docker.

cat /etc/pam.d/cron |sed -e "s/required     pam_loginuid.so/optional     pam_loginuid.so/g" > /tmp/cron && mv /tmp/cron /etc/pam.d/cron 
1
répondu helvete 2017-05-26 12:10:48

Dans mon cas, je déboguer le cron:

$ apt-get install rsyslog
$ rsyslogd
$ service cron restart
$ tail -f /var/log/syslog

Et NUMBER OF HARD LINKS > 1 erreur dans les logs.

la solution était de mettre cela dans entrypoint.sh

touch /etc/crontab /etc/cron.d/*

et boom!

0
répondu sMajeed 2018-07-08 13:38:17