Inilah cara saya menjalankan salah satu wadah cron saya.
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!"
Bangun seperti itu
docker build -t mycron .
Jalankan seperti itu
docker run -d mycron
Tambahkan skrip Anda sendiri dan edit crontab.txt dan buat saja gambarnya dan jalankan. Karena didasarkan pada alpen, gambarnya sangat kecil.
crond bekerja dengan baik dengan kecil di Alpine
RUN apk add --no-cache tini
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["/usr/sbin/crond", "-f"]
tetapi tidak boleh dijalankan sebagai proses utama kontainer (PID 1) karena masalah menuai zombie dan masalah dengan penanganan sinyal. Lihat PR Docker ini dan posting blog ini untuk detailnya.
Solusi @ken-cochrane mungkin yang terbaik, namun, ada juga cara untuk melakukannya tanpa perlu membuat file tambahan.
Untuk melakukannya tanpa file tambahan:
Caranya adalah mengatur cron di dalam entrypoint.sh
Anda berkas.
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
...