Crontab в контейнере докеров

Если вы хотите написать сценарий для добавления записей в cron (без использования текстового редактора через crontab -e), это будет что-то вроде:

  • запустите crontab -l во временный файл
  • проверьте, есть ли ваша последняя команда уже в файле. Если да, остановитесь.
  • добавьте последнюю команду во временный файл
  • запустите crontab с временным файлом в качестве параметра, чтобы заменить запланированные команды

Для справки:

  • crontab(1)- ведение файлов crontab для отдельных пользователей
  • crontab(5) - таблицы для управления cron

0
09.03.2018, 12:04
2 ответа

Что вы используете в качестве основы для своего образа Docker (, то есть что находится в строке FROM)?

Многие базовые образы Docker начинаются с минимальной установки существующего дистрибутива (, например. alpine, debian, ubuntu, centos и т. д. ), а затем вы добавляете в него все необходимые пакеты.

Если ваш базовый образ не включает cronпо умолчанию, установите его в свой файл Dockerfile с помощью соответствующего инструмента пакета дистрибутива (, например. apt-get install cron), а затем настройте его, как в любой другой системе -, например. добавив запись в системный файл crontab, например /etc/crontab, или перетащив исполняемый скрипт в /etc/cron.d.

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

0
28.01.2020, 04:29

Несколько дней назад я боролся с похожей проблемой, и вот несколько заметок, основанных на том, что я узнал в первую очередь:

  • Чтобы иметь возможность запускать контейнер как службу, где-то (в cmd или точке входа )должна быть запущена программа переднего плана. В вашем случае это будетnginx -g daemon off;(из образа nginx ).

  • Также, если есть точка входа и cmd, они запускаются так, как cmd передается точке входа в качестве аргумента (точно так же, как./entrypoint.sh [cmd])

  • Нет смысла иметь RUN /etc/init.d/cron start, так как после того, как образ построен, он все равно будет завершен.

И к решению :Он использовал entrypoint.sh подобный этому (в моем случае django/gunicorn/cron):

#!/bin/bash

set -e # exit on any error

if [ "$1" = './gunicorn.sh' ]; then  # './gunicorn.sh' is default command
  cron                               # this runs cron as daemon
  crontab -u django /app/crontab     # this applies a crontab from a file
  exec su django -c "$@"             # this actually runs the default command as different user (you can just use exec "$@" if you dont need to run it as different user)
fi

exec "$@" # this runs any other cmd without starting cron (e.g. docker run -ti myimage /bin/bash)
1
29.07.2020, 10:53

Теги

Похожие вопросы