docker - немає кронт-коду для root


10

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

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

Докерфайл:

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 у вузлі

Вирішити це допомогло поєднання 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
У мене є лише ознайомлення з кроном, але я думаю, що для того, щоб зробити це розумним, CMD повинен запустити crond. В іншому випадку контейнер вийде після завершення команди crontab.
JimmyJames

@JimmyJames Те, що ви говорите, є правильним, але, як я пояснив вище, краще рішення - запустити ці команди із зовнішнього крона як разові docker runs. Більше контейнер-у. :)
Артур Цесієльський

Ви можете мати рацію. Питання цікаве тим, що незрозуміло, чи є сенс запускати crond як команду вашого контейнера. Це може бути працездатним, але це виглядає незручно в контейнері.
JimmyJames

3

Якщо додати це /etc/crontab, це не відображатиметься в особистому crontab кореня, оскільки він містить лише специфічну для користувача 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.


Я думаю, я це розумію. Мої налаштування побудови призначені для користувача, але мої параметри запуску намагаються запустити з кореневого кроб-коду? це має сенс, я спробую обійти це. Я здогадуюсь, ти не мав на увазі: ADD . /etc/crontabяк це не працює.
TomFirth

@TomFirth: Це не має особливого сенсу. Будь ласка, прочитайте мою редакцію для отримання більш детальної інформації.
Свен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.