Настроить cron параллельно с разовой работой
Создайте файл сценария, скажем, run.sh, с заданием, которое должно периодически выполняться.
#!/bin/bash
timestamp=`date +%Y/%m/%d-%H:%M:%S`
echo "System path is $PATH at $timestamp"
Сохранить и выйти.
Используйте Entrypoint вместо CMD
Если у вас есть несколько заданий, которые нужно запустить во время контейнера докера, используйте файл точки входа, чтобы запустить их все.
Файл точки входа - это файл сценария, который вступает в действие при выполнении команды запуска Docker. Итак, все шаги, которые мы хотим выполнить, могут быть помещены в этот файл скрипта.
Например, у нас есть 2 задания для запуска:
Запустить один раз задание : echo «Docker-контейнер запущен»
Запустить периодическое задание : run.sh
Создать entrypoint.sh
#!/bin/bash
# Start the run once job.
echo "Docker container has been started"
# Setup a cron schedule
echo "* * * * * /run.sh >> /var/log/cron.log 2>&1
# This extra line makes it a valid cron" > scheduler.txt
crontab scheduler.txt
cron -f
Давайте разберемся crontab, который был установлен в файле
* * * * *
: Расписание Cron; работа должна выполняться каждую минуту. Вы можете обновить расписание на основе ваших требований.
/run.sh
: Путь к файлу скрипта, который должен периодически запускаться
/var/log/cron.log
: Имя файла для сохранения вывода запланированного задания cron.
2>&1
: Журналы ошибок (если таковые имеются) также будут перенаправлены в тот же выходной файл, который использовался выше.
Примечание : не забудьте добавить дополнительную новую строку, так как это делает ее действительным cron.
Scheduler.txt
: полная установка cron будет перенаправлена в файл.
Использование системных / пользовательских переменных среды в cron
Моя настоящая работа cron ожидала большинство аргументов, поскольку переменные окружения передавались команде запуска docker. Но с bash я не смог использовать ни одну из переменных среды, которая принадлежит системе или контейнеру Docker.
Затем это подошло к решению этой проблемы:
- Добавьте следующую строку в entrypoint.sh
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
- Обновите настройку cron и укажите
SHELL=/bin/bash
BASH_ENV=/container.env
Наконец, вы entrypoint.sh
должны выглядеть так
#!/bin/bash
# Start the run once job.
echo "Docker container has been started"
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
# Setup a cron schedule
echo "SHELL=/bin/bash
BASH_ENV=/container.env
* * * * * /run.sh >> /var/log/cron.log 2>&1
# This extra line makes it a valid cron" > scheduler.txt
crontab scheduler.txt
cron -f
Последнее, но не менее важное: создайте Dockerfile
FROM ubuntu:16.04
MAINTAINER Himanshu Gupta
# Install cron
RUN apt-get update && apt-get install -y cron
# Add files
ADD run.sh /run.sh
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /run.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh
Вот и все. Создайте и запустите образ Docker!
RUN apt-get update && apt-get install cron