Мой 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
, но это показывает только ошибку, потому что в нем перечислены root
s личный только crontab (который оказывается пустым), а не общесистемный в /etc/crontab
. Все это совершенно нормально и ожидаемо. Чтобы показать строку, добавленную вашим скриптом, вы должны заменить CMD crontab -l
с участием CMD cat /etc/crontab
.
Все это не имеет ничего общего с командами dockerfile вроде ADD
, RUN
или CMD
, это просто базовые вещи Linux.