Как добавить задание в cron/anacron при создании контейнера Docker

Я пытаюсь добавить простую задачу cron для запуска в моём Docker-контейнере. Мне нужно, чтобы она была добавлена на этапе настройки, чтобы автоматически выполняться после завершения команды ./launcher rebuild app.

Задача cron работает, когда я вручную добавляю её в файл /etc/cron.d/anacron с помощью vim, но если я редактирую файл, не открывая и не сохраняя его явно (например, командой echo -n '* * * * * root python3 /var/www/discourse/script/email_me.py' >> /etc/cron.d/anacron), cron, похоже, не замечает изменений и не запускает задачу.
Если же я затем добавлю пробел в любом месте файла с помощью vim и сохраню его, cron обнаружит изменения и начнёт выполнять задачу.
Поскольку изменения не фиксируются при добавлении через команду echo, добавление этой команды в мой файл app.yml не работает.
Я также пробовал выполнять docker restart app после добавления изменений через echo, но это тоже не помогло.

Мне кажется, что должен быть более простой способ, который я упускаю. Необходимость редактировать файл anacron после настройки кажется неправильным подходом.

Можете подробнее объяснить, что именно вы здесь пытаетесь сделать?

Скорее всего, вам будет гораздо проще создать плагин для вашего форума, который запускается по расписанию через Sidekiq.

Спасибо за ответ! Возможно, так станет понятнее:

  • Я запускаю приватно размещённый репозиторий Discourse с некоторыми пользовательскими файлами.
  • В директории script проекта Discourse у меня есть файл email_me.py.
  • При запуске этот файл отправляет мне письмо с текстом «Hello World!».
  • Я хочу создать задачу cron в Docker-контейнере Discourse, которая будет запускать этот файл каждую минуту.
  • Это можно сделать, вручную добавив строку * * * * * root python3 /var/www/discourse/script/email_me.py в файл /etc/cron.d/anacron с помощью редактора, например vim.
  • Мне нужно, чтобы эта задача cron запускалась при настройке контейнера Discourse, но я не могу использовать vim для этого из файла app.yml.
  • Я попробовал использовать команду echo -n '* * * * * root python3 /var/www/discourse/script/email_me.py' >> /etc/cron.d/anacron в файле app.yml. Это успешно добавляет строку в файл anacron, но задача НЕ выполняется (как будто изменения не были зарегистрированы).

Я просто пытаюсь найти способ заставить задачу:
* * * * * root python3 /var/www/discourse/script/email_me.py
запускаться после пересборки с помощью ./launcher rebuild app.

Вам действительно стоит последовать совету @eviltrout и сделать это правильно в виде плагина, используя наши запланированные задания Sidekiq.

Однако, если вы хотите возиться с этими неподдерживаемыми изменениями в cron, вам, вероятно, потребуется перезапустить службу после добавления задания с помощью команды sv restart cron.

Также, чтобы прояснить ситуацию: меня интересует ваша конечная цель, а не шаги, которые вы используете для её достижения. Если цель — получать письмо каждую минуту, это можно реализовать через Sidekiq-задачу в плагине, что значительно проще.

Моя конечная цель — выполнить запрос к базе данных для поиска конкретной активности пользователей и отправить электронное письмо с таблицей, содержащей результаты. Это письмо будет служить подтверждением предварительной оплаты, так как пользователи, совершившие эту активность, получат оплату позже в тот же день (через PayPal) с помощью другого скрипта, запускаемого по расписанию cron.

У меня уже есть скрипты, способные выполнять обе эти задачи, но мне нужно найти способ заставить контейнер Discourse запускать их раз в неделю.

Я не знаком с Sidekiq. Если он может это сделать, где мне следует искать информацию, чтобы освоить его?

Спасибо!

(Также я пробовал sv restart cron и многие другие способы перезапуска cron, но безрезультатно)

Я бы начал с серии обучающих материалов по плагинам, чтобы понять базовую структуру плагина:

Если вы хотите пример того, как добавить задачу в плагин, обратите внимание на плагин discourse-assign: в нём есть задача для отправки периодических напоминаний:

https://github.com/discourse/discourse-assign/blob/master/jobs/scheduled/enqueue_reminders.rb

Как было предложено, вам следует написать правильный плагин, но вот как сделать то, что вы просили.

Вы можете добавить что-то вроде этого в секцию run в конце файла app.yml.

  - exec: cp /shared/rr/cron.d.rr /etc/cron.d/rr

Вам нужно разместить как ваш скрипт, так и этот файл в какой-либо директории, которая мапится через shared, а не в директории discourse.

Да, всё сработало идеально. Мне пришлось создать папку rr и файл cron.d.rr. Я поместил свою задачу cron в файл cron.d.rr, и команда cp выполнилась успешно.

Спасибо!

Теперь нужно заняться написанием полноценного плагина…