This is docker image for running cronjobs via a container. Its main purpose is, to trigger other docker containers via cron.
A possible use case are backups - you want to have regular backups for you dockerized application stack with neither setting up a cronjob inside your database container nor setting up cron on the host.
With this container you can easily achieve this, by exposing the docker socket from the host to this container and setting up cronjobs via an environment variable.
For setting up cronjobs, you have to pass an environment variable DOCKER_CRONTAB
to it - it can be _"multi-line", i.e. contain multiple entries by separating them with \n
.
Although you can run arbitrary commands inside this container, you likely want to run some sort of docker command from inside the container communicating with the outside docker daemon, for this you have to pass the docket socket to it.
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro \
-e DOCKER_CRONTAB=\
'*/5 * * * * docker info > /cron-env/docker-info.txt' \
zalari/docker-cron
docker-compose
is also conveniently provided in this image and this allows for adding cron functionality quite easily to your applications stacks:
# ...
#this is a special service for exporting something to stdout
#to use: docker-compose run --rm -T dump_db_out > db_dump/dump.sql
dump_db_out:
image: mysql:5
# usually you would want some more params for mysqldump
command: mysqldump
depends_on:
- db
cron:
image: zalari/docker-cron
volumes:
- ./docker-compose.yml:/cron-env/project/docker-compose.yml
- ./db_dump:/cron-env/project/db_dump
- /var/run/docker.sock:/var/run/docker.sock
environment:
- |
DOCKER_CRONTAB=
30 22 * * * cd /cron-env/project && docker-compose run --rm -T dump_db_out > db_dump/`date +"%m-%d-%y"`-project.sql
30 22 * * * cd /cron-env/project/db_dump && find *.sql -mtime +30 -delete
The image is based on the rather latest alpine
image and thus only BusyBox and ash are available for cronjobs; if you need more tooling, simply base your image off this one.
You can also use the default cronjobs from alpine
if you either add something or bind-mount to the following dirs in the container:
/etc/periodic/15min
/etc/periodic/hourly
/etc/periodic/daily
/etc/periodic/weekly
/etc/periodic/monthly
For listing the actual crontab
of the running container, simply run: docker exec container-name cat /var/spool/cron/crontabs/root