Задания Cron с использованием Whenever with VM, Docker и Dokku

У меня есть приложение Ruby on Rails в контейнере Docker на Ubuntu 14.04. Я настроил свои развертывания с помощью Dokku, но не знаю, как заставить мои задания cron работать правильно.

В настоящее время я использую гем whenever, который позволяет мне делать что-то простое, например:

every 5.minutes do
  runner 'MyModel.run_something'
end

Проблема в том, что я думаю, что каждый раз, когда я развертываю с помощью git push dokku master, он сбрасывает контейнер и возвращает его по умолчанию, тем самым удаляя все мои расписания cron.

Тогда я подумал, что, возможно, планирование cron должно быть вне контейнера, а вместо этого на уровне виртуальной машины.

В настоящее время я не вижу никаких заданий cron, независимо от того, что я делаю. Вот что происходит, когда я запускаю crontab -l при ssh'd:

root@dashboard:~# crontab -l
no crontab for root

Я новичок в виртуализации контейнеров, поэтому прошу прощения, если пропустил важную часть этого, но я в тупике.


person Anthony    schedule 04.11.2014    source источник


Ответы (2)


Мне потребовалась целая вечность, чтобы решить эту проблему - вместо этого я вызвал команду rails через crontabs. У меня также есть приложение rails, загруженное на dokku с Ubuntu на сервере цифрового океана. Попытка заставить жемчужину Whenever работать... она просто не работает. whenever -i не работает.

Всякий раз, когда на самом деле не создает никаких новых crontabs для среды dokku. Тем не менее, это хорошо для понимания синтаксиса Cron!

Вот как я получил запланированные задачи для работы в dokku:

  1. Вручную создайте свой собственный crontab через sudo crontab -e, который откроет его в vi/vim.

Вы можете использовать sudo crontab -r для его удаления или sudo crontab -l для просмотра текущих crontabs

  1. Добавьте следующий код в новый crontab

Приведенный ниже код будет выполняться каждую 1 минуту.

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
* * * * * /bin/bash -c 'dokku run appname rails r MyModel.run_something'

Сделайте ваши переменные среды эквивалентными тем, которые у вас есть в команде env

  1. grep CRON /var/log/syslog, чтобы просмотреть журнал выходных данных для устранения неполадок. Возможно, вам придется установить postfix через sudo apt-get install postfix, чтобы Cron отправлял уведомления об ошибках по почте, иначе вы можете получить “(CRON) info (No MTA installed, discarding output)” ошибку из системного журнала.

  2. cat /var/mail/root для просмотра почты, полученной от Cron, с сообщением об ошибках, если задание cron не работает.

Надеюсь, это полезно. Это то, что я получил по крайней мере!

person Bilton Tran    schedule 22.11.2014
comment
Хороший обходной путь, но я считаю, что его действительно сложно поддерживать, и всякий раз, когда это исключено, я тоже думал об использовании run и пытаюсь найти более надежную альтернативу, хотя хороший вызов. - person Laurent; 08.02.2018

Всякий раз, когда, вероятно, не работает, потому что демон cron не работает в вашем контейнере Docker/Dokku. Docker будет запускать только указанные процессы, используя либо директиву CMD, либо директиву RUN, либо скрипт, выполняемый одной из этих директив.

Ребята из Dokku прямо заявили, что cron не поддерживается в Dokku, хотя и не объяснили, почему. Быстрый поиск cron в Dokku, Buildstep и базового образа Dokku не дают результатов , поэтому похоже, что Dokku никогда не запускает службу cron при создании/запуске приложения.

Предлагаемые ими решения заключаются в том, чтобы либо настроить задание cron на хост-компьютере (как вы уже поняли), либо использовать веб-служба планирования или попробуйте Scheduler от Heroku.

person Nick    schedule 22.11.2014
comment
Спасибо, Ник, здесь есть отличная информация. - person Anthony; 22.11.2014
comment
Примечание: пока dokku в настоящее время не управляет cron, у нас есть официальная документация о том, как использовать dokku в сочетании с cron здесь. - person Jose Diaz-Gonzalez; 14.02.2016