finestra mobile - nessun crontab per root


10

Il mio Dockerfile sembra compilato correttamente (mi dice così). Quando eseguo il contenitore, viene visualizzato il seguente messaggio di errore. Ho provato a eseguire i comandi ( CMD) con e senza la directory del servizio.

crontab.shfondamentalmente scrive una pianificazione cron in un file di testo ( cron.jobs) e quindi importa il file di testo 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 (alcuni croni sono stati rimossi):

#!/bin/bash

cat <<- 'EOF' > cron.jobs

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

EOF

crontab cron.jobs

Errore:

no crontab for root

Note a margine:

  • Pulse è il nome del servizio.
  • La versione del nodo è obsoleta a causa del servizio, questo verrà aggiornato.
  • Il servizio è essenzialmente per lavori cron nel nodo

Una combinazione di serverfault.com/a/851500/395574 e serverfault.com/a/851479/395574 ha contribuito a risolvere questo problema.
TomFirth,

Risposte:


11

È un problema con il file docker (piuttosto che con i comandi nel file). Ne CMDviene eseguito solo uno (l'ultimo) - consultare https://docs.docker.com/engine/reference/builder/#cmd

In un Dockerfile può esserci solo un'istruzione CMD. Se si elenca più di un CMD, avrà effetto solo l'ultimo CMD.


Ah, e c'è quello in cima a tutto il resto :) A OP: Questo non invalida la mia spiegazione e dovresti essenzialmente sostituire il tuo CMDcon RUN.
Sven

2
Penso che chiamare questo un problema sia un po 'fuori. Questo comportamento è in base alla progettazione. I contenitori non sono mini-OS. Sono incentrati sull'applicazione.
JimmyJames,

Concordato. La mia intenzione era di chiarire che il problema del PO risiedeva nella loro configurazione docker piuttosto che nei dettagli di cron.
Paul Haldane,

Questo non è un problema di finestra mobile . È di progettazione.
Andrew Savinykh,

5

Come già spiegato nelle altre risposte, ne CMDverrà eseguito solo uno per Dockerfile e il comando che si desidera eseguire è errato.

Ma c'è un problema più urgente con la tua installazione IMO: i container Docker non sono generalmente progettati per funzionare in questo modo. Quello che dovresti fare invece è eseguire i servizi cron dall'host (o dal tuo orchestrator) come processi una tantum (probabilmente usando qualcosa di simile docker runo docker-compose run, o, se per qualche motivo non vuoi avviare un contenitore separato per questo, io suppongo che potresti usare docker exec).

Questa è solo la mia opinione su come dovrebbero essere usati i contenitori, quindi ovviamente dovresti prenderlo con un granello di sale.


2
Ho solo una familiarità passeggera con cron ma penso che per renderlo sensato, il CMD avrebbe bisogno di funzionare a crond. In caso contrario, il contenitore verrà chiuso al termine del comando crontab.
JimmyJames,

@JimmyJames Quello che stai dicendo è corretto, ma come ho spiegato sopra, la soluzione migliore è eseguire questi comandi da un cron esterno come una tantum docker run. Più container-y. :)
Artur Ciesielski

Potresti avere ragione. La domanda è interessante perché non è chiaro se abbia senso eseguire crond come comando del proprio contenitore. Potrebbe essere praticabile ma sembra imbarazzante in un contenitore.
JimmyJames,

3

Se lo aggiungi a /etc/crontab, questo non verrebbe visualizzato nel crontab personale di root, poiché contiene solo il crontab specifico dell'utente modificato con crontab -e, non quello a livello di sistema in /etc.


Più dettagli:

La mia ipotesi è che /pulse/crontab.sh(cosa che non mostri, perché?) Aggiunge la linea crontab pertinente al file crontab a livello di sistema /etc/crontab. Successivamente esegue il comando crontab -l, ma questo mostra solo un errore perché elenca rooti personal crontab solo (che risulta essere vuoto), non quella a livello di sistema /etc/crontab. Questo è tutto perfettamente normale e previsto. Per mostrare la linea dello script aggiunto, si dovrebbe sostituire CMD crontab -lcon CMD cat /etc/crontab.

Tutto ciò non ha nulla a che fare con qualsiasi comando dockerfile come ADD, RUNo CMD, è solo roba Linux di base.


Penso di capirlo. Le mie impostazioni di build sono su utente ma le mie impostazioni di esecuzione stanno tentando di eseguire dal crontab del root? ha senso, cercherò di aggirare questo. Immagino che non volessi dire: ADD . /etc/crontabnon funziona.
TomFirth,

@TomFirth: questo non ha molto senso. Per favore leggi la mia modifica per ulteriori dettagli.
Sven
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.