Работа cron не работает внутри контейнера докера на ubuntu
У меня есть простой файл Docker, как показано ниже.
FROM ubuntu:latest
ADD crontab /etc/cron.d/test-cron
RUN chmod a+x /etc/cron.d/test-cron
RUN touch /var/log/cron.log
CMD cron && tail -f /var/log/cron.log
а содержимое файла crontab
так же просто, как
* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
# empty line
Когда я запускаю это на своей локальной машине OS X (с запуском док-машины), он отлично работает ( "Hello world" печатается в журнал каждый раз). Однако, когда я пытаюсь запустить его на машине Ubuntu, задание cron не запускается (пустой файл журнала).
Здесь команда, которую я использую для запуска контейнера
docker build -t crontest .
docker run --name cron crontest
Я не знаю, почему это так. Интересно, что что-то не так с ящиком Ubuntu, который у меня есть (неправильная установка времени?). Я попытался перезапустить эту машину бездействия. В настоящее время у меня есть другие контейнеры докеров, запущенные в поле Ubuntu, и они работают нормально.
Любое предложение о том, что я могу сделать, чтобы отлаживать/исправлять это, было бы чрезвычайно оценено.
EDIT:
После входа в контейнер (docker exec -it cron /bin/bash
) я могу проверить, работает ли cron:
[email protected]:/# ps -ef | grep cron
root 1 0 0 20:15 ? 00:00:00 /bin/sh -c cron && tail -f /var/log/cron.log
root 6 1 0 20:15 ? 00:00:00 cron
root 7 1 0 20:15 ? 00:00:00 tail -f /var/log/cron.log
root 25 11 0 20:21 ? 00:00:00 grep --color=auto cron
Ответы
Ответ 1
Установите rsyslog внутри контейнера с помощью apt-get install rsyslog
и запустите его командой rsyslogd
перед запуском cron с cron -L15
(максимальная регистрация). Затем просмотрите файл /var/log/syslog
внутри контейнера, чтобы увидеть собственный журнал журнала демона. Он скажет вам, была ли проблема в анализе вашего crontab, и в вашем случае он регистрирует запись каждую минуту, подобную приведенной ниже, если она зарегистрирована и пытается выполнить вашу работу.
CRON[16]: (root) CMD (echo "Hello world" >> /var/log/cron.log 2>&1)
Ответ 2
У меня была аналогичная проблема, в частности, с Ubuntu 14.04. Для отладки я попытался запустить cron на переднем плане и обнаружил, что он генерирует сообщения System error
при попытке выполнить запланированные задания.
По-видимому, это известная проблема с параметром --net=host
(ref: https://github.com/moby/moby/issues/5899). Я попробовал передать --pid=host
, как было предложено, и с этим задания cron начали нормально работать.
Ответ 3
У меня была резервная копия script под названием backup.sh
, которую я скопировал в /etc/cron.daily
.
script не был вызван должным образом.
Чтобы сделать это, мне пришлось переименовать его только в backup
без .sh
Итак, для меня ls -l /etc/cron.daily
был следующий вывод:
[email protected]:/# ls -l /etc/cron.daily
total 24
-rwxr-xr-x 1 root root 1474 Sep 13 16:47 apt-compat
-rwxrwxr-x 1 root root 45 Nov 9 11:18 dobackup
-rwxr-xr-x 1 root root 1597 Feb 22 2017 dpkg
-rwxr-xr-x 1 root root 4125 Mar 2 2016 exim4-base
-rwxr-xr-x 1 root root 249 May 17 11:59 passwd
Чтобы проверить/проанализировать это, я использовал следующий подход:
Я просмотрел файл crontab cat /etc/crontab
, на котором показана следующая строка для ежедневных cronjobs:
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
Затем я выделил резервную копию script в выделенную папку:
mkdir /etc/cron.test
mv /etc/cron.daily/dobackup /etc/cron.test
Затем, запустив
test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.test)
и используя ps auxf
в другом терминале, я показал, что теперь выполняются задания. Вы также можете проверить, что он перерывы при переименовании в версию .sh
:
mv /etc/cron.test/dobackup /etc/cron.test/dobackup.sh
test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.test)
Затем он существует немедленно, поэтому никакое задание не выполняется.