Come eseguire un processo cron all'interno di un contenitore finestra mobile?


275

Sto cercando di eseguire un cronjob all'interno di un contenitore docker che invoca uno script di shell.

Ieri ho cercato su tutto il Web e ho overflow dello stack, ma non sono riuscito a trovare una soluzione che funzioni.
Come posso fare questo?

MODIFICARE:

Ho creato un repository github (commentato) con un contenitore cron docker funzionante che richiama uno script shell a un dato intervallo.

Risposte:


365

Puoi copiare il tuo crontab in un'immagine, in modo che il contenitore avviato da detta immagine esegua il lavoro.

Vedi " Esegui un lavoro cron con Docker " di Julien Boulay nel suo Ekito/docker-cron:

Creiamo un nuovo file chiamato " hello-cron" per descrivere il nostro lavoro.

* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# An empty line is required at the end of this file for a valid cron file.

Il seguente Dockerfile descrive tutti i passaggi per creare l'immagine

FROM ubuntu:latest
MAINTAINER docker@ekito.fr

RUN apt-get update && apt-get -y install cron

# Copy hello-cron file to the cron.d directory
COPY hello-cron /etc/cron.d/hello-cron

# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron

# Apply cron job
RUN crontab /etc/cron.d/hello-cron

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Run the command on container startup
CMD cron && tail -f /var/log/cron.log

(vedi Gaafar 's commento e Come faccio apt-getinstallare meno rumoroso? :
apt-get -y install -qq --force-yes cronpuò funzionare troppo)

Come osservato da Nathan Lloyd nei commenti :

Nota rapida su un gotcha:
se stai aggiungendo un file di script e stai dicendo a cron di eseguirlo, ricorda che Cron fallisce silenziosamente se lo dimentichi .
RUN chmod 0744 /the_script


O, assicurarsi che il lavoro stesso reindirizzare direttamente a stdout / stderr invece di un file di log, come descritto nella hugoShaka 's risposta :

 * * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2

Sostituisci l'ultima riga Dockerfile con

CMD ["cron", "-f"]

Vedi anche (about cron -f, ovvero cron "primo piano") " docker ubuntu cron -fnon funziona "


Compilalo ed eseguilo:

sudo docker build --rm -t ekito/cron-example .
sudo docker run -t -i ekito/cron-example

Sii paziente, attendi 2 minuti e la tua riga di comando dovrebbe visualizzare:

Hello world
Hello world

Eric aggiunge nei commenti :

Si noti che tailpotrebbe non visualizzare il file corretto se viene creato durante la creazione dell'immagine.
In tal caso, è necessario creare o toccare il file durante il runtime del contenitore per consentire a tail di prelevare il file corretto.

Vedere "L' output di tail -falla fine di una finestra mobile CMDnon viene visualizzato ".


1
Ho dovuto prima installare cron, in quanto non è incluso. Ma aggiungendo questo al Dockerfile funziona. Grazie! RUN apt-get update && apt-get install cron
C Heyer,

2
dovresti probabilmente aggiungere -yl'installazione di cron per evitare di uscire dalla finestra mobile
gafi

1
@Gaafar Right! Ho incluso il tuo commento nella risposta per maggiore visibilità e ho aggiunto un'altra opzione.
VonC

6
Questa soluzione funziona ancora? Quando seguo le linee guida fornite, quando accedo al contenitore come root e digito crontab -l, ottengo No crontab installato per root , anche il mio schermo rimane vuoto. Tuttavia, quando controllo '/etc/cron.d/', vedo che il campo crontab è lì (e ancora più sorprendentemente), quando controllo /var/log/cron.log, vedo che lo script è in esecuzione (il contenuto del file viene aggiunto Hello World). Sto tirando questa immagine nella mia Dockerfile: FROM phusion/baseimage:0.10.0. Qualche idea sulla discrepanza nel comportamento?
Homunculus Reticulli,

11
A partire dal 2018, questo approccio non funziona più; qualcuno è stato in grado di far funzionare il suo cronjob con Ubuntu come immagine di base? Non mi interessa l'immagine alpina che viene fuori con cron che si esaurisce
pellicano il
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.