Docker - kein Crontab für Wurzel

10

Meine Docker-Datei scheint korrekt zu sein (das sagt es mir). Wenn ich den Container ausführe, wird die folgende Fehlermeldung angezeigt. Ich habe versucht, die Befehle ( CMD) mit und ohne Dienstverzeichnis auszuführen .

crontab.shschreibt im Grunde einen Cron-Zeitplan in eine Textdatei ( cron.jobs) und importiert dann die Textdatei in 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 (einige crons wurden entfernt):

#!/bin/bash

cat <<- 'EOF' > cron.jobs

0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1

EOF

crontab cron.jobs

Error:

no crontab for root

Randnotizen:

  • Puls ist der Name des Dienstes.
  • Die Version des Knotens ist aufgrund des Dienstes alt, dies wird aktualisiert.
  • Der Dienst ist im Wesentlichen für Cron-Jobs im Knoten vorgesehen
TomFirth
quelle
Eine Kombination aus serverfault.com/a/851500/395574 und serverfault.com/a/851479/395574 half dabei, dieses Problem zu lösen.
TomFirth

Antworten:

11

Es ist ein Problem mit der Docker-Datei (und nicht mit den Befehlen in der Datei). Es wird nur einer CMDausgeführt (der letzte) - siehe https://docs.docker.com/engine/reference/builder/#cmd

In einer Docker-Datei kann es nur eine CMD-Anweisung geben. Wenn Sie mehr als eine CMD auflisten, wird nur die letzte CMD wirksam.

Paul Haldane
quelle
Ach, und es ist , dass oben auf alles andere :) Für OP: Dies gilt nicht meine Erklärung ungültig machen und Sie würden im Wesentlichen ersetzen müssen Ihre CMDmit RUN.
Sven
2
Ich denke, dies als Problem zu bezeichnen, ist ein wenig abwegig. Dieses Verhalten ist beabsichtigt. Container sind keine Mini-Betriebssysteme. Sie sind anwendungsorientiert.
JimmyJames
Einverstanden. Ich wollte klarstellen, dass das Problem des OP eher in der Docker-Konfiguration als in den Details von cron liegt.
Paul Haldane
Dies ist kein Docker- Problem . Es ist beabsichtigt.
Andrew Savinykh
5

Wie die anderen Antworten bereits erläutert haben, wird nur eine CMDpro Docker-Datei ausgeführt, und der Befehl, den Sie ausführen möchten, ist falsch.

Es gibt jedoch ein dringenderes Problem mit Ihrem Setup. IMO - Docker-Container sind normalerweise nicht dafür ausgelegt, auf diese Weise zu funktionieren. Sie sollten stattdessen die Cron-Dienste vom Host (oder Ihrem Orchestrator) als einmalige Prozesse ausführen (wahrscheinlich mit etwas wie docker runoder docker-compose run, oder, wenn Sie aus irgendeinem Grund keinen separaten Container dafür starten möchten, ich denke du könntest verwenden docker exec).

Dies ist nur meine Ansicht darüber, wie Behälter verwendet werden sollten, daher sollten Sie sie natürlich mit einem Körnchen Salz einnehmen.

Artur Ciesielski
quelle
2
Ich bin nur vorübergehend mit Cron vertraut, aber ich denke, um dies sinnvoll zu machen, müsste das CMD Crond ausführen. Andernfalls wird der Container nach Abschluss des Befehls crontab beendet.
JimmyJames
@JimmyJames Was Sie sagen, ist richtig, aber wie ich oben erklärt habe, besteht die bessere Lösung darin, diese Befehle von einem externen Cron als einmaliges docker runs auszuführen . Mehr Container-y. :)
Artur Ciesielski
Da könntest du recht haben. Die Frage ist interessant, da nicht klar ist, ob es sinnvoll ist, crond als Befehl Ihres Containers auszuführen. Es mag praktikabel sein, aber es scheint in einem Container umständlich zu sein.
JimmyJames
3

Wenn Sie dies hinzufügen, /etc/crontabwird dies nicht in der persönlichen Crontab von root angezeigt, da diese nur die benutzerspezifische Crontab enthält, die mit bearbeitet wurde crontab -e, nicht die systemweite in /etc.


Mehr Details:

Ich vermute, dass /pulse/crontab.sh(was Sie nicht zeigen, warum?) Die relevante Crontab-Zeile zur systemweiten Crontab-Datei hinzufügt /etc/crontab. Sie führen später den Befehl crontab -l, aber das zeigt nur einen Fehler , da es Listen roots persönliche crontab nur (die leer sein geschieht), nicht die systemweiten in /etc/crontab. Das ist alles völlig normal und wird erwartet. Um zu zeigen , die Zeile Ihr Skript hinzugefügt, würden Sie ersetzen CMD crontab -lmit CMD cat /etc/crontab.

All dies hat nichts mit Dockerfile-Befehlen zu tun ADD, RUNoder CMDes ist nur einfaches Linux-Zeug.

Sven
quelle
Ich glaube ich verstehe das. Meine Build-Einstellungen beziehen sich auf den Benutzer, aber meine Run-Einstellungen versuchen, von der Crontab des Roots aus ausgeführt zu werden. das macht Sinn, ich werde versuchen, das zu umgehen. Ich vermute, du hast nicht gemeint: ADD . /etc/crontabda das nicht funktioniert.
TomFirth
@ TomFirth: Das macht nicht viel Sinn. Bitte lesen Sie meine Bearbeitung für weitere Details.
Sven