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.sh
schreibt 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
Antworten:
Es ist ein Problem mit der Docker-Datei (und nicht mit den Befehlen in der Datei). Es wird nur einer
CMD
ausgeführt (der letzte) - siehe https://docs.docker.com/engine/reference/builder/#cmdquelle
CMD
mitRUN
.Wie die anderen Antworten bereits erläutert haben, wird nur eine
CMD
pro 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 run
oderdocker-compose run
, oder, wenn Sie aus irgendeinem Grund keinen separaten Container dafür starten möchten, ich denke du könntest verwendendocker 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.
quelle
docker run
s auszuführen . Mehr Container-y. :)Wenn Sie dies hinzufügen,
/etc/crontab
wird dies nicht in der persönlichen Crontab von root angezeigt, da diese nur die benutzerspezifische Crontab enthält, die mit bearbeitet wurdecrontab -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 Befehlcrontab -l
, aber das zeigt nur einen Fehler , da es Listenroot
s 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 ersetzenCMD crontab -l
mitCMD cat /etc/crontab
.All dies hat nichts mit Dockerfile-Befehlen zu tun
ADD
,RUN
oderCMD
es ist nur einfaches Linux-Zeug.quelle
ADD . /etc/crontab
da das nicht funktioniert.