Мой 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
Примечания стороны:
- Пульс это название сервиса.
- Версия узла старая из-за службы, она будет обновлена.
- Сервис предназначен для заданий cron в узле
Ответы:
Это проблема с dockerfile (а не с командами в файле). Запускается только один
CMD
(последний) - см. Https://docs.docker.com/engine/reference/builder/#cmdисточник
CMD
сRUN
.Как уже объяснили другие ответы,
CMD
в Dockerfile будет запущен только один , а команда, которую вы хотите выполнить, неверна.Но при настройке IMO возникает более насущная проблема - контейнеры Docker обычно не предназначены для такой работы. Вместо этого вам следует запускать службы cron с хоста (или вашего оркестратора) как одноразовые процессы (возможно, с использованием чего-то вроде
docker run
илиdocker-compose run
, или, если по какой-то причине вы не хотите запускать отдельный контейнер для этого, я думаю, вы могли бы использоватьdocker exec
).Это только мой взгляд на то, как следует использовать контейнеры, поэтому, очевидно, вы должны взять его с зерном соли.
источник
docker run
s. Больше контейнеров :)Если вы добавите это в
/etc/crontab
, это не будет отображаться в личном crontab пользователя root, так как он содержит только пользовательский crontab, отредактированный с помощьюcrontab -e
, а не общесистемный/etc
.Больше деталей:
Я предполагаю, что
/pulse/crontab.sh
(что вы не показываете, почему?) Добавляет соответствующую строку crontab в системный файл crontab/etc/crontab
. Позже вы выполните командуcrontab -l
, но это только показывает ошибку , потому что в нем перечисляютсяroot
S личный кронтаб только (который оказывается пустым), а не в масштабах всей системы в один/etc/crontab
. Это все совершенно нормально и ожидаемо. Чтобы показать строку, которую добавил ваш скрипт, вы должны заменитьCMD crontab -l
наCMD cat /etc/crontab
.Все это не имеет ничего общего с любыми командами dockerfile, такими как
ADD
,RUN
илиCMD
, это просто основные вещи Linux.источник
ADD . /etc/crontab
как это не работает.