Docker - нет crontab для root

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

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

Файл Dockerfile:

FROM node:0.10MAINTAINER TomVOLUME /var/log/RUN mkdir /pulseADD . /pulseWORKDIR /pulseRUN apt-get update && apt-get install -y cronADD *.sh /pulse/RUN chmod 750 /pulse/crontab.sh && chmod 750 /pulse/RUN chmod 644 /etc/crontabCMD cron -fCMD touch /var/log/cron.log && sh /pulse/crontab.sh && tail -f /var/log/cron.logCMD cron /pulse/cron.jobsCMD crontab -l

edited to add crontab.sh

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

#!/bin/bashcat <<- 'EOF' > cron.jobs0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1EOFcrontab cron.jobs

Ошибка:

no crontab for root

Побочные примечания:

  • Pulse - это название службы.
  • Версия узла устарела из-за сервиса, она будет обновлена.
  • Служба, по сути, предназначена для заданий cron в узле

Это проблема с файлом dockerfile (а не с командами в файле).Единственный CMD выполняется (последний) - см. https://docs.docker.com/engine/reference/builder/#cmd

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

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

Но есть более насущная проблема с вашей настройкой 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.

Комбинация из cron - docker - no crontab for root - Server Fault и cron - docker - no crontab for root - Server Fault помог решить эту проблему.