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
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
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
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
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!