в docker, tips

Docker совет №14: Как запускать задачи по крону — в контейнере или на хост-машине?


Docker предоставляет прекрасный функционал для изоляции отдельных процессов в контейнерах, но когда дело доходит до запуска периодических задач, неизменно возникают вопросы. Давайте разберемся!

Примечание. Когда я говорю о периодических задачах, я имею в виду запуск заданий с помощью крона (cron) или его аналогов.

В голову приходят как минимум три варианта запуска периодических задач касательно docker-контейнеров:

  1. Использовать кронтаб (crontab) на хост-машине.
  2. Создать отдельный контейнер с утилитой cron и запускать задачи из него.
  3. Добавить cron в уже существующие контейнеры и запускать в них 2 процесса.

Третий вариант мы обсуждать не будем, ведь это не самая лучшая идея и она не соответствует идеологии docker (один процесс — один контейнер).

Мне больше по душе первый вариант — использование кронтаба с хост-машины для запуска периодических задач в docker-контейнере. Например, чтобы запускать переиндексацию в docker-контейнере sphinxsearch каждые 15 минут, в рутовый кронтаб на хосте достаточно добавить следующую строку:

*/15 * * * * root docker exec sphinxsearch indexer --config /etc/sphinxsearch/sphinx.conf  --rotate --all

Иногда данный вариант запуска периодических задач в docker-контейнерах может не подойти — например, при использовании кластера из нескольких нод под управлением docker swarm. В данном случае есть как минимум две проблемы:

  • контейнеры могут запускаться на любой ноде кластера (мы сознательно не упоминаем о настройках placement);
  • имя контейнеров генерируется автоматически и похоже на ed_sphinxsearch.1.ynaet761oxaxeq1zm5bv97fpg.

В этом случае уже гораздо разумнее и правильнее будет собрать отдельный docker-контейнер с утилитой cron и нужным crontab (в процессе разработки crontab можно монтировать с хоста в docker-контейнер).

Примечание. К слову, вы должны также позаботиться о возможности запуска задач вида docker exec <имя_контейнера> ... внутри вашего cron-контейнера, например дать возможность контейнеру взаимодействовать с docker daemon на хост-машине.

В следующей статье рассмотрим подробнее пример создания docker-контейнера для запуска cron’овых задач, которые будут успешно выполняться как на отдельном docker-хосте, так и в кластере docker swarm.

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