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

Работа 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
4b9b3361

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

Затем он существует немедленно, поэтому никакое задание не выполняется.