Налаштуйте крон паралельно одноразовій роботі
Створіть файл сценарію, скажімо run.sh, із завданням, яке повинно виконуватися періодично.
#!/bin/bash
timestamp=`date +%Y/%m/%d-%H:%M:%S`
echo "System path is $PATH at $timestamp"
Збережіть і вийдіть.
Використовуйте Entrypoint замість CMD
Якщо у вас є кілька завдань, які потрібно розпочати під час контейнерної докері, використовуйте файл вхідних даних, щоб запустити їх усі.
Файл вступу - це файл сценарію, який вступає в дію при видачі команди запуску докера. Отже, всі кроки, які ми хочемо виконати, можна помістити в цей файл сценарію.
Наприклад, у нас є 2 завдання для запуску:
Запустити один раз завдання : відлуння "Контейнер 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
Давайте розберемося з кронтабом, який було встановлено у файлі
* * * * *
: Графік Cron; робота повинна працювати щохвилини. Ви можете оновити графік, виходячи зі своєї вимоги.
/run.sh
: Шлях до файлу сценарію, який потрібно запускати періодично
/var/log/cron.log
: Ім'я файлу для збереження виводу запланованого завдання cron.
2>&1
: Журнали помилок (якщо такі є) також будуть перенаправлені на той самий вихідний файл, який використовується вище.
Примітка . Не забудьте додати додатковий новий рядок, оскільки це робить його дійсним кроном.
Scheduler.txt
: повна установка крона буде переспрямована у файл.
Використання змінних середовища / специфічного для користувача середовища в cron
Моє фактичне завдання cron очікувало більшості аргументів, оскільки змінні середовища переходили до команди run docker. Але, з bash, я не зміг використати жодну із змінних оточення, що належать до системи або контейнера докера.
Потім це було вирішенням цієї проблеми:
- Додайте наступний рядок у 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