2016-05-03 4 views
8

Я попытался запустить хроны внутри контейнера DockerКак запустить хроны внутри контейнера Docker

, но ничего не работает для меня

моего контейнера только cron.daily и cron.weekly файл

кронтаб, cron.d, cron.hourly ... отсутствуют в моем контейнере

кронтаб -e также не работает

мой контейнер работает с/бен/Баш

+0

Вы читали какие-либо страницы документации или человека на cron (8), crontab (1) или crontab (5)? Что заставляет вас думать, что вам нужен crontab (1)? Вы можете отредактировать свой crontab (5) без и только HUP cron (8). В качестве альтернативы создайте свой собственный образ с добавленными. Поскольку я не уверен, что вы выполнили даже самые фундаментальные исследования, я не склонен перечислять эти шаги, за исключением подсказки для чтения на Dockerfiles. – Marakai

ответ

36

Вот как я запустил один из моих контейнеров cron.

Dockerfile:

FROM alpine:3.3 

ADD crontab.txt /crontab.txt 
ADD script.sh /script.sh 
COPY entry.sh /entry.sh 
RUN chmod 755 /script.sh /entry.sh 
RUN /usr/bin/crontab /crontab.txt 

CMD ["/entry.sh"] 

crontab.txt

*/30 * * * * /script.sh >> /var/log/script.log 

entry.sh

#!/bin/sh 

# start cron 
/usr/sbin/crond -f -l 8 

script.sh

#!/bin/sh 

# code goes here. 
echo "This is a script, run by cron!" 

Построить как так

docker build -t mycron . 

Run как так

docker run -d mycron 

Добавить свои собственные скрипты и редактировать crontab.txt и просто создать образ и запустить. Поскольку он основан на альпийском, изображение супер мало.

+0

Thx для решения! Он отлично работает для моего использования. –

+0

Я не могу выдвинуть это достаточно. Я пробовал так много разных способов заставить cron работать в докере, это смешно. Проблема в том, что есть нулевой выход, когда что-то идет не так, но ваше решение правильно запускает его на переднем плане и регистрирует проблемы! Спасибо! – Sarke

6

благодарит за этот шаблон.

Я только удивляться одна линия в entry.sh

/usr/sbin/crond -f -L 8

crond -Help урожаи:

Usage: crond -fbS -l N -d N -L LOGFILE -c DIR 

     -f  Foreground 
     -b  Background (default) 
     -S  Log to syslog (default) 
     -l N Set log level. Most verbose:0, default:8 
     -d N Set log level, log to stderr 
     -L FILE Log to FILE 
     -c DIR Cron dir. Default:/var/spool/cron/crontabs 

поэтому, возможно, вы хотели бы, а поставить небольшой л

/usr/sbin/crond -f -l 8

istead большого «L»

/usr/sbin/crond -f -L 8

установить уровень журнала по умолчанию, так как указания логфайл под названием 8 не кажется, что они предназначаются.

0

crond хорошо работает с tiny на Alpine

RUN apk add --no-cache tini 

ENTRYPOINT ["/sbin/tini", "--"] 
CMD ["/usr/sbin/crond", "-f"] 

, но не должен быть запущен в качестве контейнера основного процесса (PID 1) из-за зомби пожинать проблемы и проблемы с обработкой сигналов. См. this Docker PR и this blog post.

+1

Почему не следует запускать PID1? –

Смежные вопросы