Назад | Перейти на главную страницу

docker - нет crontab для root

Мой Dockerfile создается правильно (он мне так говорит). Когда я запускаю контейнер, я получаю следующее сообщение об ошибке. Я пробовал запускать команды (CMD) с каталогом службы и без него.

crontab.sh в основном записывает расписание cron в текстовый файл (cron.jobs), а затем импортирует текстовый файл в crontab.

Dockerfile:

FROM node:0.10
MAINTAINER Tom

VOLUME /var/log/

RUN mkdir /pulse
ADD . /pulse
WORKDIR /pulse

RUN apt-get update && apt-get install -y cron

ADD *.sh /pulse/
RUN chmod 750 /pulse/crontab.sh && chmod 750 /pulse/

RUN chmod 644 /etc/crontab

CMD cron -f
CMD touch /var/log/cron.log && sh /pulse/crontab.sh && tail -f /var/log/cron.log
CMD cron /pulse/cron.jobs
CMD crontab -l

edited to add crontab.sh

crontab.sh (удалены некоторые кроны):

#!/bin/bash

cat <<- 'EOF' > cron.jobs

0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1

EOF

crontab cron.jobs

Ошибка:

no crontab for root

Боковые примечания:

Это проблема с файлом докеров (а не с командами в файле). Только один CMD запущен (последний) - см. https://docs.docker.com/engine/reference/builder/#cmd

В Dockerfile может быть только одна инструкция CMD. Если вы укажете более одного CMD, то вступит в силу только последний CMD.

Как уже объясняли другие ответы, только один CMD будет запускаться для каждого файла Docker, и команда, которую вы хотите запустить, неверна.

Но есть более насущная проблема с вашей установкой IMO - контейнеры Docker обычно не предназначены для работы таким образом. Вместо этого вам следует запускать службы cron с хоста (или вашего оркестратора) как разовые процессы (возможно, используя что-то вроде docker run или docker-compose run, или, если по какой-то причине вы не хотите запускать для этого отдельный контейнер, я думаю, вы могли бы использовать docker exec).

Это всего лишь мой взгляд на то, как следует использовать контейнеры, поэтому, очевидно, вы должны относиться к этому с недоверием.

Если вы добавите это в /etc/crontab, это не будет отображаться в личном crontab root, поскольку он содержит только пользовательский crontab, отредактированный с помощью crontab -e, а не общесистемный в /etc.


Подробнее:

Я предполагаю, что /pulse/crontab.sh (который вы не показываете, почему?) добавляет соответствующую строку crontab в общесистемный файл crontab /etc/crontab. Позже вы выполните команду crontab -l, но это показывает только ошибку, потому что в нем перечислены roots личный только crontab (который оказывается пустым), а не общесистемный в /etc/crontab. Все это совершенно нормально и ожидаемо. Чтобы показать строку, добавленную вашим скриптом, вы должны заменить CMD crontab -l с участием CMD cat /etc/crontab.

Все это не имеет ничего общего с командами dockerfile вроде ADD, RUN или CMD, это просто базовые вещи Linux.