docker - brak pliku crontab dla roota

10

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.shw 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
TomFirth
źródło
Połączenie serverfault.com/a/851500/395574 i serverfault.com/a/851479/395574 pomogło rozwiązać ten problem.
TomFirth

Odpowiedzi:

11

Jest to problem z plikiem dokera (zamiast poleceń w pliku). CMDUruchomiony jest tylko jeden (ostatni) - patrz https://docs.docker.com/engine/reference/builder/#cmd

W Dockerfile może znajdować się tylko jedna instrukcja CMD. Jeśli podasz więcej niż jedną CMD, tylko ostatnia CMD zadziała.

Paul Haldane
źródło
Ach, i nie jest to, że na domiar wszystkiego :) OP: nie unieważnić moje wyjaśnienie i byś zasadniczo trzeba wymienić CMDz RUN.
Sven
2
Myślę, że nazwanie tego problemem jest trochę nie w porządku. To zachowanie jest zgodne z projektem. Kontenery nie są mini-OS. Są one zorientowane na aplikacje.
JimmyJames
Zgoda. Moim zamiarem było wyjaśnienie, że problem OP leżał w konfiguracji dokera, a nie w szczegółach crona.
Paul Haldane
To nie jest problem z dokerem . To jest z założenia.
Andrew Savinykh
5

Jak już wyjaśniono w innych odpowiedziach, CMDna 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 runlub docker-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.

Artur Ciesielski
źródło
2
Mam tylko krótką znajomość crona, ale myślę, że aby uczynić to sensownym, CMD musiałby uruchomić cronda. W przeciwnym razie kontener opuści się po zakończeniu polecenia crontab.
JimmyJames
@JimmyJames To, co mówisz, jest poprawne, ale jak wyjaśniłem powyżej, lepszym rozwiązaniem jest uruchomienie tych poleceń z zewnętrznego crona jako jednorazowe docker run. Więcej kontenera. :)
Artur Ciesielski
Możesz mieć racje. Pytanie jest interesujące, ponieważ nie jest jasne, czy uruchomienie crond jako polecenia kontenera jest sensowne. Może to być wykonalne, ale w pojemniku wydaje się niewygodne.
JimmyJames
3

Jeśli dodasz to do /etc/crontab, to nie pojawi się w osobistym crontabie roota, ponieważ zawiera on tylko specyficzny dla użytkownika edytowany crontab crontab -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ć polecenie crontab -l, ale to tylko pokazuje błąd gdyż wymienione roots 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 -lz CMD cat /etc/crontab.

Wszystko to nie ma nic wspólnego z żadnymi poleceniami pliku dokera, takimi jak ADD, RUNlub CMD, to po prostu podstawowe rzeczy z Linuksa.

Sven
źródło
Myślę, że to rozumiem. Moje ustawienia kompilacji dotyczą użytkownika, ale ustawienia uruchamiania próbują uruchomić się z crontab roota? to ma sens, spróbuję to obejść. Zgaduję, że nie miałeś na myśli: ADD . /etc/crontabponieważ to nie działa.
TomFirth
@TomFirth: To nie ma większego sensu. Proszę przeczytać moją edycję, aby uzyskać więcej informacji.
Sven