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.shactually 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-settingsas 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 (ex- library/alpine:3.5). Optional.
- container: Full container name. Ignored if- imageis included. Optional.
- dockerargs: Command line docker- run/- execarguments for full control. Defaults to- trigger: Array of docker-crontab subset objects. Sub-set includes:- image,- container,- command,- dockerargs
- onstart: Run the command on- crontabcontainer start, set to- true. 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/letsencrypt.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 lsto see existing networks
- if your docker-compose.ymlis inmy_dirdirectory, you probably has networkmy_dir_default
- otherwise read the docker-compose docs
 
- use 
- Add dockerargsto your docker-crontabconfig.json- use --network NETWORK_NAMEto connect new container into docker-compose network
- use --name NAMEto 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"]