Проблемы с запуском 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/*
и бум!