Как использовать Cron с контейнерами Docker — CloudSavvy IT

Запуск фоновых задач по расписанию — стандартное требование серверных служб. Раньше настройка была простой — вы определяли свои задачи в crontab своего сервера и заканчивали. Давайте посмотрим, как вы можете использовать cron при использовании Docker для развертывания.

Использование контейнеров для ваших сервисов увеличивает продуктивность разработчиков. В то же время это может заставить вас задуматься, как традиционный системный администратор соотносится с концепциями Docker. У вас есть несколько вариантов использования cron с контейнерами Docker, и мы рассмотрим их ниже в порядке их пригодности. Прежде чем продолжить, убедитесь, что вы установили Docker и создали образ Docker своего приложения.

Использование Crontab хоста

По сути, вы всегда можете использовать установку cron на хосте, на котором работает ваш Docker Engine. Убедитесь, что cron установлен, а затем отредактируйте системный crontab как обычно.

Вы можете использовать docker exec для запуска команды в существующем контейнере:

* / 5 * * * * docker exec example_app_container /example-scheduled-task.sh

Это будет работать, только если вы заранее знаете название контейнера. Обычно лучше создать новый контейнер, который существует исключительно для выполнения задачи:

* / 5 * * * * docker run —rm example_app_image: latest /example-scheduled-task.sh

Каждые пять минут установка cron вашей системы будет создавать новый контейнер Docker с использованием образа вашего приложения. Docker выполнит сценарий /example-scheduled-task.sh в контейнере. Контейнер будет уничтожен (—rm) после выхода из скрипта.

Использование Cron в ваших контейнерах

Использование crontab хоста нарушает контейнеризацию Docker, поскольку запланированные задачи требуют ручной настройки в вашей системе. Вам необходимо убедиться, что cron установлен на каждом хосте, на котором вы развертываете. Хотя это может быть полезно при разработке, вам следует по возможности интегрировать cron в свои Dockerized сервисы.

Большинство популярных базовых образов Docker по умолчанию не включают демон cron. Вы можете установить его в свой Dockerfile, а затем зарегистрировать crontab своего приложения.

Сначала создайте новый файл crontab в своей кодовой базе:

* / 5 * * * * / usr / bin / sh /example-scheduled-task.sh

Затем измените свой Dockerfile, чтобы установить cron и зарегистрировать crontab — вот как вы можете сделать это с помощью образа на основе Debian:

RUN apt-get update && apt-get install -y cron КОПИРОВАТЬ example-crontab /etc/cron.d/example-crontab RUN chmod 0644 /etc/cron.d/example-crontab && crontab /etc/cron.d/ пример-crontab

Мы устанавливаем cron и копируем crontab нашей кодовой базы в каталог /etc/cron.d. Затем нам нужно изменить разрешения для нашего crontab, чтобы убедиться, что он доступен для cron. Наконец, используйте команду crontab, чтобы сообщить о файле демону cron.

Чтобы завершить эту настройку, вам необходимо изменить команду образа или точку входа, чтобы запускать демон cron при запуске контейнеров. Вы не можете добиться этого с помощью этапа RUN в вашем Dockerfile, потому что это временные этапы, которые не сохраняются после этапа сборки образа. Служба будет запущена в временном контейнере, используемом для создания слоя, а не в конечных контейнерах, в которых запущен завершенный образ.

Если единственной задачей вашего контейнера является запуск cron — о чем мы поговорим подробнее ниже — вы можете добавить ENTRYPOINT [«cron», «-f»] в ваш Dockerfile, чтобы запустить его как процесс переднего плана. Если вам нужно сохранить на переднем плане другой процесс, например веб-сервер, вы должны создать специальный сценарий точки входа (например, ENTRYPOINT [«bash», «init.sh»]) и добавьте запуск службы cron в качестве команды в этот файл.

Отделение Cron от сервисов вашего приложения

Реализация настройки, описанной в предыдущем разделе, обеспечивает более надежное решение, чем использование crontab хоста. Добавление демона cron к контейнерам, обслуживающим ваше приложение, гарантирует, что любой, кто использует ваш образ Docker, будет автоматически настраивать запланированные задачи.

Тем не менее, это все еще приводит к смешению опасений. У ваших контейнеров есть две обязанности: во-первых, обеспечивать функциональность приложения, а во-вторых, поддерживать cron в рабочем состоянии и запускать запланированные задачи. В идеале каждый контейнер должен предоставлять одну конкретную функциональную единицу.

По возможности, вы должны запускать свои задачи cron в отдельном контейнере для вашего приложения. Если вы создаете веб-сервер, это будет означать, что один контейнер предоставляет ваш веб-сервер, а другой — запускает cron на переднем плане.

Без этого разделения вы не сможете использовать оркестратор, такой как Docker Swarm или Kubernetes, для запуска нескольких реплик вашего приложения. В каждом контейнере будет запускаться собственный демон cron, в результате чего запланированные задачи будут выполняться несколько раз. Этого можно избежать, используя файлы блокировки, привязанные к общему тому Docker. Тем не менее, легче решить проблему с корнем и ввести специальный контейнер для демона cron.

Как правило, вы хотите, чтобы оба контейнера были основаны на образе Docker вашего приложения. Каждому из них потребуется подключение к томам и сетям Docker вашей службы. Это гарантирует, что контейнер cron будет иметь среду, идентичную контейнеру приложения, с той лишь разницей, что это процесс переднего плана.

Это не жесткое правило — в некоторых проектах ваши запланированные задачи могут быть тривиальными сценариями, которые работают независимо от вашей кодовой базы. В этом случае контейнер cron может использовать минимальный базовый образ и отказаться от подключений к ненужным периферийным ресурсам.

Один из способов настроить отдельный контейнер cron — использовать docker-compose. Вы бы определили контейнер cron как дополнительную услугу. Вы можете использовать базовый образ своего приложения, переопределив команду точки входа для запуска демона cron. Использование docker-compose также упрощает подключение контейнера к любым общим томам и сетям, которые ему требуются.

версия: «3» services: app: image: demo-image: последние тома: — data: / app-data cron: image: demo-image: последняя точка входа: / bin / команда bash: [«cron», «-f»]объемы: — данные: / приложение-данные объемы: данные:

Используя приведенный выше пример, один контейнер обслуживает наше приложение, используя точку входа по умолчанию на изображении. Убедитесь, что это так нет запустить демон cron! Второй контейнер переопределяет точку входа изображения для запуска cron. Пока в образе установлен cron и настроен ваш crontab, вы можете использовать docker-compose up для запуска своего приложения.

Использование Kubernetes Cron Jobs

Наконец, давайте посмотрим на простой пример запуска запланированных задач в Kubernetes. Kubernetes имеет собственный ресурс CronJob, который вы можете использовать в своих манифестах.

Вам не нужно устанавливать cron в свой образ или настраивать специализированные контейнеры, если вы используете Kubernetes. Имейте в виду, что CronJob — это бета-ресурс, который может измениться в будущих выпусках Kubernetes.

apiVersion: batch / v1beta1 kind: CronJob metadata: name: my-cron namespace: my-namespace spec: schedule: «* / 5 * * * *» concurrencyPolicy: Forbid jobTemplate: spec: template: spec: container: — name: my -container image: my-image: последняя команда: [«/bin/bash», «/my-cron-script.sh»]restartPolicy: OnFailure

Примените указанный выше манифест к своему кластеру, чтобы создать новое задание cron, которое будет запускать /my-cron-script.sh в вашем контейнере каждые пять минут. Частота дается как обычное определение cron для ключа расписания в спецификации ресурса.

Вы можете настроить ConcurrencyPolicy так, чтобы контролировать, будет ли Kubernetes позволяет вашим работам перекрываться. По умолчанию используется значение «Разрешить», но его можно изменить на «Запретить» (запретить запуск новых заданий, пока одно из них уже существует) или «Заменить» (завершить существующее задание, как только начнется новое).

Использование встроенного ресурса Kubernetes — это рекомендуемый способ управления запланированными задачами в ваших кластерах. Вы можете легко получить доступ к журналам заданий и не беспокоиться о подготовке контейнеров для использования с cron. Вам просто нужно создать образ Docker, содержащий все, что нужно для выполнения ваших задач. Kubernetes будет обрабатывать создание и уничтожение экземпляров контейнеров по указанному вами расписанию.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *