Как создать docker-контейнер в проекте на Yii2, в котором бы работал cron?
У меня есть проект на Yii2 который разнесен по контейнерам: backend, frontend и т.п. и есть необходимость раз в сутки вызывать консольную команду, типа php yii cron/midnight и для этого я хочу добавить в мой docker-compose новый микросервис в виде отдельного контейнера, который бы бы подхватывал хранимый в репозитории проекта файл с описанием cron-сценариев и обрабатывал бы их уже внутри себя.
Проблема в том, что при всей простоте задачи - такой контейнер я могу создать разными способами на основе разных образов, но вот добиться следов выполнения заданий по cron - я никак не могу. Cron вроде как оказывается запущенным, но ожидаемых результатов от работы - нет :(
Может ли кто подсказать простую реализацию такого cron-контейнера, который бы умел в php yii по крону?
такой контейнер я могу создать разными способами на основе разных образов, но вот добиться следов выполнения заданий по cron - я никак не могу. Cron вроде как оказывается запущенным, но ожидаемых результатов от работы - нет :(
Хотелось бы увидеть что конкретно вы уже пробовали сделать. Приведите пример Dockerfile и docker-compose.yml, с вашими экспериментами с кроном.
Общая структура проекта выглядит так:
имеет смысл для демонстрации сделать что-нибудь простое, например, в лог-файл выводить дату/время каждую минуту - это и будет признаком того что крон отрабатывает корректно.
для запуска вот часть из docker-compose:
вот содержимое для ./cron/crontab: * * * * * date >> /var/log/cron.log
вот содержимое для ./cron/Dockerfile:
# Используем базовый образ
FROM yiisoftware/yii2-php:7.4-fpm-nginx
# Устанавливаем cron и другие необходимые пакеты
RUN apt-get update && apt-get install -y cron
# Создаем файл для логов
RUN touch /var/log/cron.log && chmod 0666 /var/log/cron.log
# Копируем crontab файл в контейнер
COPY crontab /etc/cron.d/my-cron-job
# Даем права на выполнение crontab файла
RUN chmod 0644 /etc/cron.d/my-cron-job
# Применяем crontab
RUN crontab /etc/cron.d/my-cron-job
# Запускаем cron в foreground режиме
CMD ["cron", "-f"]
а, ну и самое главное ж забыл написать )) ... контейнер в таком виде стартует успешно, и даже крон кажется запущен, но вот обзор файла через cat /var/log/cron.log ничего не даёт - файл пуст, т.е. задание не выполняется получается. В других похожих тестах я пытался выполнить логику через php yii *, но никаких ожидаемых изменений в хранимых данных - так же не происходило
Vitsliputsli, то, что cron запущен - я проверяю в консоли контейнера через команду service cron status и в результате выводится cron is running - из чего я делаю вывод, что cron - работает в фоне, но я ожидаю в лог-файле увидеть вывод временной метки, задание которой описано сценарии (см. строку с COPY crontab /etc/cron.d/my-cron-job в Dockerfile) , но cat /var/log/cron.log показывает что файл лога пуст. ... я пробовал задавать различные варианты, даже не связанные с выводом данных в файл лога (ну мало ли, вдруг с правами что-то и т.п.), а направленные напрямую на взаимодействие с yii-логикой , но ни в одном из вариантов я не видел результатов выполнения задания - ни внутри контейнера, ни в подключаемом каталоге проекта, ни в БД.
Да, это самый очевидный вариант, но я хочу добиться большей автономности от хостовой системы, с целью полного управления сценариями и их применением, хочется иметь свой микросервис для этого.
Тогда еще более очевидный вариант, запускать не в контейнере. Ну серьезно, делать контейнер половина функционала которого работает на хостовой машине - это треш.
Vitsliputsli, вы путаете докер-контейнеры с виртуалками. Докер контейнер в большинстве случаев - просто используется в качестве изоляции окружения для запуска ПО. В таком контексте запустить приложение извне в контейнере по крону - вполне допустимый кейс, чем напихивать контейнеры кучей всего, делая из них подобия виртуалок.
Хотя тут вы правы, - чем напихивать в контейнеры кучу всего - проще тогда уж делать все на хостовой машине...
Почитать про "supercronic" воодушевиться и добавить supercronic в образ с backend, затем из образа backend запустить контейнер, собственно, с backend и из этого же образа запустить supercronic в соседнем контейнере, в котором и будет выполняться целевая команда по расписанию заданному в crontab