Zde je návod, jak spouštím jeden ze svých kontejnerů cron.
Dockerfile:
FROM alpine:3.3
ADD crontab.txt /crontab.txt
ADD script.sh /script.sh
COPY entry.sh /entry.sh
RUN chmod 755 /script.sh /entry.sh
RUN /usr/bin/crontab /crontab.txt
CMD ["/entry.sh"]
crontab.txt
*/30 * * * * /script.sh >> /var/log/script.log
entry.sh
#!/bin/sh
# start cron
/usr/sbin/crond -f -l 8
script.sh
#!/bin/sh
# code goes here.
echo "This is a script, run by cron!"
Sestavte tak
docker build -t mycron .
Běž tak
docker run -d mycron
Přidejte své vlastní skripty a upravte soubor crontab.txt a stačí vytvořit obrázek a spustit. Vzhledem k tomu, že je založen na alpském stylu, je obrázek velmi malý.
crond funguje dobře s tiny na Alpine
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["/usr/sbin/crond", "-f"]
ale neměl by být spuštěn jako hlavní proces kontejneru (PID 1) kvůli problému se sklízením zombie a problémům se zpracováním signálů. Podrobnosti naleznete v tomto PR Docker a v tomto příspěvku na blogu.
Řešení @ken-cochrane je pravděpodobně nejlepší, nicméně existuje také způsob, jak to udělat, aniž byste museli vytvářet další soubory.
Chcete-li to provést bez dalších souborů:
Způsob, jak jít, je nastavit cron v rámci entrypoint.sh
soubor.
Dockerfile
...
# Your Dockerfile above
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
echo "* * * * * echo 'I love running my crons'" >> /etc/crontabs/root
crond -l 2 -f > /dev/stdout 2> /dev/stderr &
# You can put the rest of your entrypoint.sh below this line
...