Проблемы с запуском cron в Docker на разных хостах

Im пытается получить контейнер docker работает чесотка мои cronjobs

im работает очень простой cron в качестве теста в контейнере docker с использованием centOS 6.5 base

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

он отлично работает, если контейнер работает на хосте CoreOS, однако, если я запускаю контейнер на хосте ubuntu 13.10, cron не выполняется. (Я хотя хост не влиял на то, что работало в контейнере)

на обоих хостах работает docker 0.8

Я пропустил что-то очевидное, или это ошибка?

спасибо

4 ответов


короткий ответ:

добавьте эту строку в dockerfile

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

долгий ответ

из того, что я понимаю, проблема связана с различиями в ядре между CoreOS & Unbutu. это, в свою очередь, вызывает проблему безопасности pam.

чтобы понять это, нам сначала нужно включить ведение журнала для cron (так как мы находимся в docker, обычный запуск не выполняется). запустить

service rsyslog start
service crond restart

в журнале cron была эта ошибка (находится здесь /var/log/cron)

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

Итак, я взглянул на журнал безопасности, и у него была эта ошибка (расположенная здесь /var/log/secure)

pam_loginuid(crond:session): set_loginuid failed

еще немного погуглил и обнаружил, что мне нужно изменить конфигурацию pam cond (найдено здесь /etc/pam.d / crond) отредактируйте этот файл и прокомментируйте следующую строку

#session    required   pam_loginuid.so

перезапустить crond и все должно быть хорошо


базовые контейнеры Docker не запускают службы, такие как cron - они запускают только то, что вы указываете в ENTRYPOINT/CMD

некоторые "более толстые" контейнеры используют такие вещи, как supervisord для запуска служб, но, где это возможно, его более ремонтопригодно для разделения служб на разные контейнеры и обмена данными с помощью контейнеров томов или --link


@ dwitz's ответ правильный, но мне пришлось изменить немного, чтобы заставить его работать для меня на Ubuntu 16.04 в контейнере 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 

в моем случае я отлаживаю cron:

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

и нашли NUMBER OF HARD LINKS > 1 ошибка в логах.

решение было поставить в entrypoint.sh

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

и бум!