Подтвердить что ты не робот

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

Я пытаюсь запустить контейнер докеров, чтобы сжать мои cronjobs

im запускает очень простой cron в качестве теста в контейнере докера, используя базу centOS 6.5

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

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

на обоих хостах работает докер 0.8

Мне не хватает чего-то очевидного или это ошибка?

спасибо

4b9b3361

Ответ 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