Как правильно сделать связку в 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
  • Вопрос задан
  • 10047 просмотров
Решения вопроса 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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Искра Екатеринбург
от 80 000 до 100 000 ₽
Art gorka Санкт-Петербург
от 60 000 ₽
от 40 000 до 60 000 ₽
19 апр. 2024, в 18:38
1500 руб./в час
19 апр. 2024, в 18:36
1500 руб./за проект
19 апр. 2024, в 18:36
30000 руб./за проект