Mój plik Docker wydaje się poprawnie budować (tak mi mówi). Po uruchomieniu kontenera pojawia się poniższy komunikat o błędzie. Próbowałem uruchomić polecenia ( CMD
) z katalogiem usługi i bez niego.
crontab.sh
w zasadzie zapisuje harmonogram crona w pliku tekstowym ( cron.jobs
), a następnie importuje plik tekstowy do crontab.
Plik Docker:
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 (niektóre korony zostały usunięte):
#!/bin/bash
cat <<- 'EOF' > cron.jobs
0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1
EOF
crontab cron.jobs
Błąd:
no crontab for root
Notatki dodatkowe:
- Puls to nazwa usługi.
- Wersja węzła jest stara ze względu na usługę, zostanie zaktualizowana.
- Usługa dotyczy głównie zadań cron w węźle
Odpowiedzi:
Jest to problem z plikiem dokera (zamiast poleceń w pliku).
CMD
Uruchomiony jest tylko jeden (ostatni) - patrz https://docs.docker.com/engine/reference/builder/#cmdźródło
CMD
zRUN
.Jak już wyjaśniono w innych odpowiedziach,
CMD
na plik Dockerf zostanie uruchomiona tylko jedna , a polecenie, które chcesz uruchomić, jest niepoprawne.Istnieje jednak pilniejszy problem z konfiguracją IMO - kontenery Docker zwykle nie są zaprojektowane do działania w ten sposób. Zamiast tego powinieneś uruchomić usługi cron z hosta (lub twojego orchestratora) jako procesy jednorazowe (prawdopodobnie używając czegoś takiego jak
docker run
lubdocker-compose run
, lub jeśli z jakiegoś powodu nie chcesz uruchamiać do tego osobnego kontenera, I Chyba mógłbyś użyćdocker exec
).To tylko mój pogląd na to, jak należy używać pojemników, więc oczywiście powinieneś wziąć to z odrobiną soli.
źródło
docker run
. Więcej kontenera. :)Jeśli dodasz to do
/etc/crontab
, to nie pojawi się w osobistym crontabie roota, ponieważ zawiera on tylko specyficzny dla użytkownika edytowany crontabcrontab -e
, a nie systemowy/etc
.Więcej szczegółów:
Domyślam się, że
/pulse/crontab.sh
(czego nie pokazujesz, dlaczego?) Dodaje odpowiednią linię crontab do ogólnosystemowego pliku crontab/etc/crontab
. Później wykonać poleceniecrontab -l
, ale to tylko pokazuje błąd gdyż wymienioneroot
s osobisty crontab tylko (co zdarza się być pusty), a nie jeden w całym systemie/etc/crontab
. To wszystko jest całkowicie normalne i oczekiwane. Aby pokazać linię skrypt dodaną, należy wymienićCMD crontab -l
zCMD cat /etc/crontab
.Wszystko to nie ma nic wspólnego z żadnymi poleceniami pliku dokera, takimi jak
ADD
,RUN
lubCMD
, to po prostu podstawowe rzeczy z Linuksa.źródło
ADD . /etc/crontab
ponieważ to nie działa.