Проблемы с запуском cron в Docker на разных хостах
Я пытаюсь запустить контейнер докеров, чтобы сжать мои cronjobs
im запускает очень простой cron в качестве теста в контейнере докера, используя базу centOS 6.5
* * * * * /bin/echo "it works!" >> test.log
он отлично работает, если контейнер запущен на хосте CoreOS, однако, если я запустил контейнер на узле ubuntu 13.10, cron не будет выполнен. (Я, хотя хост не повлиял на то, что было в контейнере)
на обоих хостах работает докер 0.8
Мне не хватает чего-то очевидного или это ошибка?
спасибо
Ответы
Ответ 1
короткий ответ
добавьте эту строку в свой файл dockerfile
RUN sed -i '/session required pam_loginuid.so/c\#session required pam_loginuid.so' /etc/pam.d/crond
длинный ответ
из того, что я понимаю, проблема связана с различиями в ядре между CoreOS и Unbutu. это в свою очередь вызывает проблему с защитой от pam.
чтобы понять, что нам сначала нужно включить ведение журнала для cron (поскольку мы находимся в докере, обычный запуск не выполняется). запустить
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
еще несколько googling и нашел, что мне нужно изменить конфигурацию pam cond config (здесь можно найти /etc/pam.d/crond)
отредактируйте этот файл и закомментируйте следующую строку
#session required pam_loginuid.so
перезапустите crond, и все должно быть хорошо
Ответ 2
базовые контейнеры Docker не запускают такие сервисы, как cron - они запускают только то, что вы указали в ENTRYPOINT/CMD
некоторые "более толстые" контейнеры используют такие вещи, как supervisord, для запуска сервисов, но, где это возможно, его больше обслуживают отдельные сервисы в разных контейнерах и обмениваются данными с помощью контейнеров тома или -link
Ответ 3
Ответ на @dwitz верен, но мне пришлось немного изменить команду sed
, чтобы она работала для меня на Ubuntu 16.04 в контейнере докера.
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