Docker cовет №14: Как запускать задачи по крону - в контейнере или на хост-машине?
Feb 22, 2018 08:56 · 292 words · 2 minute read
Docker предоставляет прекрасный функционал для изоляции отдельных процессов в контейнерах, но когда дело доходит до запуска периодических задач, неизменно возникают вопросы. Давайте разберемся!
Примечание. Когда я говорю о периодических задачах, я имею в виду запуск заданий с помощью крона (cron
) или его аналогов.
В голову приходят как минимум три варианта запуска периодических задач касательно docker-контейнеров:
- Использовать кронтаб (
crontab
) на хост-машине. - Создать отдельный контейнер с утилитой
cron
и запускать задачи из него. - Добавить
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.