Как правильно сделать связку в Docker: php + cron?

В Docker нужно сделать так, чтобы в cron раз в сутки запускался php скрипт. Скажите, как правильно это реализовать? В интернете встречал вариант запустить в одном контейнере через supervisor сразу 2 процесса (fpm и cron), но другие говорят что каждый процесс должен быть изолирован. Так же встречал другой вариант, когда в хост-системе прописывается в крон что-то в духе docker exec php /path/to/php/script.php, но это сильно смахивает на костыль. Я создал 2 контейнера: в одном php в другом cron. Связал их с помощью links и volumes, но я не могу вызвать из крона php скрипт из другого контейнера. Скажите, как все таки правильно это сделать?

Файл docker-compose.yml

cron:
    build: ./
    links:
        - "php"
    volumes:
        - "./:/home"

php:
    image: php
    command: tail -f /dev/null
    volumes:
        - "./:/home"


Файл Dockerfile

FROM centos
RUN yum -y update
RUN yum -y install crontabs
RUN sed -i -e '/pam_loginuid.so/s/^/#/' /etc/pam.d/crond
ADD cron /etc/cron.d/cron_test
RUN chmod 0644 /etc/cron.d/cron_test
RUN crontab /etc/cron.d/cron_test
CMD crond && tail -f /dev/null
  • Вопрос задан
  • 10063 просмотра
Решения вопроса 2
ice2038
@ice2038
Абсолютно нет необходимости создавать отдельный контейнер под крон, в этом нет смысла. Достаточно описать в слое выше все задачи
* * * * * docker run --rm your-container /home/user/task.sh
Ответ написан
OrlovEvgenii
@OrlovEvgenii
golang developer / DevOps
Никак.
У тебя 2 контейнера, оба изолированы друг от друга. Соответственно php ничего не знает о контейнере cron и наоборот. Короче говоря - в контейнере cron просто нет установленого php.
Через links ты просто на сетевом уровне привязываешь php контейнер к cron контейнеру, по сути это тоже самое что сделать в контейнере cron вот такую запись
echo "php x.x.x.x" >> /etc/hosts
разумеется с некоторыми нюансами.

Что можно сделать.
1. Забыть про идею крона внутри контейнера потому что это плохо.
2. Если очень хочется, то собрать Dockerfile c php-cli, тогда все заработает.

и еще пара советов по Dockerfile
не делай много объявлений RUN без крайней необходимости, старайся записывать все инсталлы в строку с разделителем &&\.
и делай образ на основе alpine
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы