A simple wrapper over docker
to all complex cron job to be run in other containers.
Yes, I'm aware of mcuadros/ofelia (>250MB when this was created), it was the main inspiration for this project. A great project, don't get me wrong. It was just missing certain key enterprise features I felt were required to support where docker is heading.
- Easy to read schedule syntax allowed.
- Allows for comments, cause we all need friendly reminders of what
update_script.sh
actually does. - Start an image using
image
. - Run command in a container using
container
. - Ability to trigger scripts in other containers on completion cron job using
trigger
. - Ability to share settings between cron jobs using
~~shared-settings
as a key.
The config file can be specified in any of json
, toml
, or yaml
, and can be defined as either an array or mapping (top-level keys will be ignored; can be useful for organizing commands)
name
: Human readable name that will be used as the job filename. Will be converted into a slug. Optional.comment
: Comments to be included with crontab entry. Optional.schedule
: Crontab schedule syntax as described in https://en.wikipedia.org/wiki/Cron. Examples:@hourly
,@every 1h30m
,* * * * *
. Required.command
: Command to be run on in crontab container or docker container/image. Required.image
: Docker images name (exlibrary/alpine:3.5
). Optional.container
: Full container name. Ignored ifimage
is included. Optional.dockerargs
: Command line dockerrun
/exec
arguments for full control. Defaults totrigger
: Array of docker-crontab subset objects. Sub-set includes:image
,container
,command
,dockerargs
onstart
: Run the command oncrontab
container start, set totrue
. Optional, defaults to false.
See config-samples
for examples.
{
"logrotate": {
"schedule":"@every 5m",
"command":"/usr/sbin/logrotate /etc/logrotate.conf"
},
"cert-regen": {
"comment":"Regenerate Certificate then reload nginx",
"schedule":"43 6,18 * * *",
"command":"sh -c 'dehydrated --cron --out /etc/ssl --domain ${LE_DOMAIN} --challenge dns-01 --hook dehydrated-dns'",
"dockerargs":"--it --env-file /opt/crontab/env/l
7E8B
etsencrypt.env",
"volumes":["webapp_nginx_tls_cert:/etc/ssl", "webapp_nginx_acme_challenge:/var/www/.well-known/acme-challenge"],
"image":"willfarrell/letsencrypt",
"trigger":[{
"command":"sh -c '/etc/scripts/make_hpkp ${NGINX_DOMAIN} && /usr/sbin/nginx -t && /usr/sbin/nginx -s reload'",
"container":"nginx"
}],
"onstart":true
}
}
This container needs to access the Docker socket to manage other containers. To do this, the docker
user inside the container must have the same group ID (GID) as the docker
group on the host system.
By default, the Dockerfile uses GID 999, which is common for the docker
group on many systems. If your host system uses a different GID, you need to specify it during the build:
# Find your host's docker group ID
getent group docker | cut -d: -f3
# Or alternatively
stat -c '%g' /var/run/docker.sock
# Then build with the correct GID
docker build --build-arg DOCKER_GID=<your_docker_gid> -t crontab .
If you encounter the error failed switching to "docker": operation not permitted
, it means the GIDs don't match. Rebuild the image with the correct GID.
docker build -t crontab .
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-v ./env:/opt/env:ro \
-v /path/to/config/dir:/opt/crontab:rw \
-v /path/to/logs:/var/log/crontab:rw \
crontab
- Figure out which network name used for your docker-compose containers
- use
docker network ls
to see existing networks - if your
docker-compose.yml
is inmy_dir
directory, you probably has networkmy_dir_default
- otherwise read the docker-compose docs
- use
- Add
dockerargs
to your docker-crontabconfig.json
- use
--network NETWORK_NAME
to connect new container into docker-compose network - use
--name NAME
to use named container - e.g.
"dockerargs": "--it"
- use
FROM registry.gitlab.com/simplicityguy/docker/crontab
COPY config.json ${HOME_DIR}/
FROM registry.gitlab.com/simplicityguy/docker/crontab
RUN apk add --no-cache logrotate
RUN echo "*/5 * * * * /usr/sbin/logrotate /etc/logrotate.conf" >> /etc/crontabs/logrotate
COPY logrotate.conf /etc/logrotate.conf
CMD ["crond", "-f"]