Докер - нет crontab для root

10

Мой 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 в узле
TomFirth
источник
Решение этой проблемы помогло сочетание serverfault.com/a/851500/395574 и serverfault.com/a/851479/395574 .
TomFirth

Ответы:

11

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

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

Пол Холдейн
источник
Ах, и есть то , что на вершине всего остального :) К OP: Это не отменяет мое объяснение , и вы бы , по существу , придется заменить CMDс RUN.
Свен
2
Я думаю, что назвать это проблемой немного не так. Такое поведение является особенностью. Контейнеры не являются мини-ОС. Они ориентированы на приложения.
JimmyJames
Согласовано. Я намеревался уточнить, что проблема ОП заключается в конфигурации их докера, а не в деталях cron.
Пол Холдейн
Это не проблема докера . Это по замыслу.
Андрей Савиных,
5

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

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

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

Артур Цизельский
источник
2
У меня есть только мимолетное знакомство с cron, но я думаю, чтобы сделать это разумным, CMD должен запустить crond. В противном случае контейнер выйдет после завершения команды crontab.
JimmyJames
@JimmyJames То, что вы говорите, правильно, но, как я объяснил выше, лучшее решение - запускать эти команды из внешнего cron как одноразовые docker runs. Больше контейнеров :)
Артур Цезельский,
Возможно, ты прав. Вопрос интересный, потому что не ясно, имеет ли смысл запускать crond в качестве команды вашего контейнера. Это может быть работоспособным, но в контейнере это выглядит неловко.
JimmyJames
3

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


Больше деталей:

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

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

Свен
источник
Я думаю, что понимаю это. Мои настройки сборки для пользователя, но мои настройки запускаются из корневого каталога crontab? это имеет смысл, я постараюсь обойти это. Я предполагаю, что вы не имели в виду: ADD . /etc/crontabкак это не работает.
TomFirth
@ TomFirth: это не имеет особого смысла. Пожалуйста, прочитайте мое редактирование для получения более подробной информации.
Свен