Я намагаюся запустити cronjob всередині контейнера докера, який викликає сценарій оболонки.
Вчора я шукав по всьому Інтернету і переповнення стека, але так і не зміг знайти рішення, яке б працювало.
Як я можу це зробити?
РЕДАГУВАННЯ: EDIT:.
Я створив (прокоментований) репозиторій github з робочим докерним cron-контейнером, який викликає скрипт оболонки з заданим інтервалом.
Ви можете скопіювати свій кронтаб в образ, щоб контейнер, запущений з цього образу, виконував завдання.
Див. статтю "Запуск завдання cron за допомогою Docker" від Julien Boulay у його Ekito/docker-cron
:
Давайте створимо новий файл з назвою "
hello-cron
" для опису нашої роботи.
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# An empty line is required at the end of this file for a valid cron file.
Наступний Docker-файл описує всі кроки по створенню вашого образу
FROM ubuntu:latest
MAINTAINER [email protected]
RUN apt-get update && apt-get -y install cron
# Copy hello-cron file to the cron.d directory
COPY hello-cron /etc/cron.d/hello-cron
# Give execution rights on the cron job
RUN chmod 0644 /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
RUN touch /var/log/cron.log
# Run the command on container startup
CMD cron && tail -f /var/log/cron.log
(див. Gaafar's коментар та Як зробити apt-get
встановлення менш шумним?:
apt-get -y install -qq --force-yes cron
також може працювати)
АБО переконайтеся, що ваше завдання перенаправляє безпосередньо в stdout/stderr, а не в лог-файл, як описано в [відповіді] hugoShaka8:
* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2
Замініть останній рядок Dockerfile на
CMD ["cron", "-f"]
Див. також (про cron -f
, тобто cron "на передній план") "docker ubuntu cron -f
не працює"
Зберіть і запустіть його:
sudo docker build --rm -t ekito/cron-example .
sudo docker run -t -i ekito/cron-example
Наберіться терпіння, почекайте 2 хвилини і ваш командний рядок повинен відобразитися:
Hello world
Hello world
Ерік додає в коментарях:
Зверніть увагу, що
tail
може не відображати правильний файл, якщо він створений під час побудови зображення.
Якщо це так, вам потрібно створити або доторкнутися до файлу під час виконання контейнера, щоб tail підхопив правильний файл.
Див. статтю "Не відображається вивід tail -f
в кінці докера CMD
".
Я створив Docker-образ на основі інших відповідей, який можна використовувати як
docker run -v "/path/to/cron:/etc/cron.d/crontab" gaafar/cron
де /path/to/cron
: абсолютний шлях до файлу crontab, або ви можете використовувати його як базу в Docker-файлі:
FROM gaafar/cron
# COPY crontab file in the cron directory
COPY crontab /etc/cron.d/crontab
# Add your commands here
Для ознайомлення, зображення знаходиться тут.
Завдання cron зберігаються в /var/spool/cron/crontabs (загальне місце у всіх відомих мені дистрибутивах). До речі, ви можете створити вкладку cron в bash, використовуючи щось подібне:
crontab -l > cronexample
echo "00 09 * * 1-5 echo hello" >> cronexample
crontab cronexample
rm cronexample
Це створить тимчасовий файл із завданням cron, а потім запрограмує його за допомогою crontab. Останній рядок видалить тимчасовий файл.