Если вы хотите написать сценарий для добавления записей в cron (без использования текстового редактора через crontab -e
), это будет что-то вроде:
crontab -l
во временный файлcrontab
с временным файлом в качестве параметра, чтобы заменить запланированные командыДля справки:
Что вы используете в качестве основы для своего образа Docker (, то есть что находится в строке FROM
)?
Многие базовые образы Docker начинаются с минимальной установки существующего дистрибутива (, например. alpine, debian, ubuntu, centos и т. д. ), а затем вы добавляете в него все необходимые пакеты.
Если ваш базовый образ не включает cron
по умолчанию, установите его в свой файл Dockerfile с помощью соответствующего инструмента пакета дистрибутива (, например. apt-get install cron
), а затем настройте его, как в любой другой системе -, например. добавив запись в системный файл crontab, например /etc/crontab
, или перетащив исполняемый скрипт в /etc/cron.d
.
В некоторых случаях cron
может быть установлен, но отключен. Вам нужно изменить сценарий запуска вашего контейнера, чтобы он запускался crond
. Это не то же самое, что использовать команду RUN в Dockerfile (, предназначенную для запуска команд во время процесса сборки контейнера, а не при запуске каждого контейнера ). Детали того, как это сделать, зависят от используемого базового изображения.
Несколько дней назад я боролся с похожей проблемой, и вот несколько заметок, основанных на том, что я узнал в первую очередь:
Чтобы иметь возможность запускать контейнер как службу, где-то (в 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)