Jeg prøver å kjøre en cronjob inne i en docker-container som påkaller et shell-skript.
I går har jeg søkt over hele nettet og stack overflow, men jeg kunne egentlig ikke finne en løsning som fungerer.
Hvordan kan jeg gjøre dette?
EDIT:
Jeg har opprettet et (kommentert) github-repository med en fungerende docker cron-container som påkaller et skallskript med gitt intervall.
Du kan kopiere din crontab til et bilde, slik at containeren som startes fra nevnte bilde kan kjøre jobben.
Se "Kjør en cron-jobb med Docker" fra Julien Boulay i hans Ekito/docker-cron
:
La oss opprette en ny fil som heter "
hello-cron
" for å beskrive jobben vår.
* * * * * 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.
Følgende Dockerfile beskriver alle trinnene for å bygge bildet ditt
FROM ubuntu:latest
MAINTAINER [email protected]
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
(se Gaafar's kommentar og Hvordan gjør jeg apt-get
installasjon mindre støyende?:
apt-get -y install -qq --force-yes cron
kan også fungere)
ELLER, sørg for at selve jobben din omdirigerer direkte til stdout/stderr i stedet for en loggfil, som beskrevet i hugoShaka's answer:
* * * * * root echo hello > /proc/1/fd/1 2>/proc/1/fd/2
Erstatt den siste Dockerfile-linjen med
CMD ["cron", "-f"]
Se også (om cron -f
, som vil si cron "forgrunnen") "docker ubuntu cron -f
fungerer ikke"
Bygg og kjør det:
sudo docker build --rm -t ekito/cron-example .
sudo docker run -t -i ekito/cron-example
Vær tålmodig, vent i 2 minutter og kommandolinjen skal vises:
Hello world
Hello world
Eric legger til i kommentarfeltet:
Vær oppmerksom på at
tail
kanskje ikke viser riktig fil hvis den opprettes under bildebygging.
Hvis det er tilfelle, må du opprette eller berøre filen under containerens kjøretid for at halen skal hente riktig fil.
Se "Output av tail -f
på slutten av en docker CMD
vises ikke".
Jeg opprettet et Docker-bilde basert på de andre svarene, som kan brukes som
docker run -v "/path/to/cron:/etc/cron.d/crontab" gaafar/cron
hvor /sti/til/cron
: absolutt sti til crontab-filen, eller du kan bruke den som en base i en Dockerfile:
FROM gaafar/cron
# COPY crontab file in the cron directory
COPY crontab /etc/cron.d/crontab
# Add your commands here
For referanse, bildet er her.
Cron-jobber lagres i /var/spool/cron/crontabs (vanlig sted i alle distroer jeg kjenner). BTW, Du kan opprette en cron-fane i bash ved hjelp av noe sånt:
crontab -l > cronexample
echo "00 09 * * 1-5 echo hello" >> cronexample
crontab cronexample
rm cronexample
Dette vil opprette en midlertidig fil med cron-oppgave, og deretter programmere den ved hjelp av crontab. Siste linje fjerner den midlertidige filen.