Почему в моем контейнере Docker не запускается мой cron-скрипт, но запускается при перезапуске службы cron?

#docker #cron

#docker #cron

Вопрос:

Cron не запускается, когда я захожу в свой контейнер, но когда я захожу в контейнер и запускаю bash service cron restart , он запускается, я не могу понять, почему это не работает с service cron restart , но не без него?

Dockerfile

 FROM ubuntu:bionic

RUN apt-get update amp;amp; apt-get -y install  
    cron 
    nano 
    psmisc 
    wget

COPY hello-cron /etc/cron.d/hello-cron

# Give execution rights on the cron job
RUN chmod  x /etc/cron.d/hello-cron

# Apply cron job
RUN crontab /etc/cron.d/hello-cron

# Create the log file to be able to run tail
CMD ["cron", "-f"]
  

мой скрипт hello-cron

 * * * * * echo "Hello world" > /usr/src/helloworldcron.log 2>amp;1
  

Комментарии:

1. crond находится снаружи или внутри контейнера? Я бы не стал помещать его внутрь, потому что для этого требуется, чтобы ваш контейнер запускался постоянно, а контейнер фокусировался на cron, а не на своей работе. Вместо этого вы должны запускать контейнер при каждом запуске задачи и размещать планирование за пределами контейнера. Подход к размещению scheudling внутри контейнера полностью противоречит идее контейнеров. Загружая его на AWS, он будет тратить ресурсы и стоить денег, ничего не делая. Даже у Kubernetes есть свое собственное afaik планирования.

2. @DanielW. Я совершенно новичок в Docker, поэтому кажется, что я допустил ошибку, поместив его в контейнер на моем сервере DO …? Как бы запустить его из-за пределов контейнера? Любая ссылка на ресурс была бы большой благодарностью!

3. Перейдите в свой hosts crontab / scheduler (crond, но также systemd будет работать) и поместите туда строку, подобную docker run ... . Также включение * * * * * означает, что он запускается каждую минуту. Возможно, вы вообще ищете не работу, а потоковую обработку.

4. О, хорошо, я думаю, что понимаю. Итак, в основном на сервере, который содержит контейнеры docker, я просто запускаю контейнер на основе задачи cron. В этом контейнере уже выполняется мой код. Затем, по завершении выполнения кода, я каким-то образом вызываю, чтобы остановить контейнер, а затем удалить его? Думая об этом, я беспокоюсь о том, как установить связь между процессом, который я хочу запустить, завершая работу и закрывая контейнер. Правильно ли я отображаю это в графическом виде?

5. В контейнерах рекомендуется использовать только 1 активный процесс, сфокусированный , и когда это сделано, контейнер автоматически останавливается. Когда вы помещаете crond свою работу в контейнер, есть 2 процесса, которые имеют фокус. Вы можете проверить, все еще запущен контейнер, и если это не так, перезапустите его. Вы даже можете настроить контейнеры на автоматический перезапуск по завершении .