Я пытаюсь запустить задание cron в контейнере вместе с HTTP-сервером официантки. Независимо от того, что я делаю, мне кажется, что cron не запускается автоматически в контейнере ...
Вот мой файл докеров:
FROM python:3.7.6-buster
RUN apt-get update -y && apt-get install -y python3-dev cron
WORKDIR /home/user
COPY . .
RUN echo "* * * * * root echo hello >> /home/log.log 2>&1\n" > /etc/cron.d/task
RUN chmod 0644 /etc/cron.d/task
RUN crontab /etc/cron.d/task
RUN touch /home/log.log
CMD cron
EXPOSE 80
ENTRYPOINT [ "waitress-serve" ]
CMD [ "-call", "main:main" ]
Я также пробовал запустить службу cron, но когда контейнер запущен, статус cron службы
показывает следующее:
[FAIL] cron не запущен ... сбой!
Что я делаю не так?
Вы не запускаете cron нигде в dockerfile. Также контейнеры не используют init.d и systemd, они не являются виртуальными машинами и не имеют собственного systemd/init.d. Вот почему вы видите следующую ошибку:
[FAIL] cron is not running ... failed!
Мое решение состоит в том, чтобы написать простой скрипт bash (или просто изменить весь CMD), который запускает crond и другие вещи, которые вы хотите работать в фоновом режиме. Пример:
crond -P -n -s && waitress-serve -call main:main && tail -f /home/log.log
Команда tail -f предназначена для предотвращения мгновенного выхода из вашего контейнера.Флаги -P -n -s предназначены для наследования пути из среды (-P), отправки вывода задания в системный журнал, что является необязательным, и это просто мое предпочтение (-s), и работы в фоновом режиме (-n ).
Затем просто скопируйте этот скрипт и измените CMD на:
CMD script.sh
Также добавьте это в свой dockerfile. Это обязательно для флага -n.
RUN sed -i '/session required pam_loginuid.so/c\#session required pam_loginuid.so' /etc/pam.d/crond
Думаю, теперь это должно сработать. Если у вас возникнут проблемы, просто напишите мне комментарий. Это мое первое решение, так что наберитесь терпения: D