willfarrell / docker-crontab

A docker job scheduler (aka. crontab for docker)
MIT License
300 stars 65 forks source link
crontab docker

docker-crontab

A simple wrapper over docker to all complex cron job to be run in other containers.

Supported tags and Dockerfile links

Why?

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.

Features

Config file

The config file can be specifed 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)

See config-samples for examples.

[{
    "schedule":"@every 5m",
    "command":"/usr/sbin/logrotate /etc/logrotate.conf"
 },{
    "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":"--env-file /opt/crontab/env/letsencrypt.env -v webapp_nginx_tls_cert:/etc/ssl -v 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'",
        "project":"conduit",
        "container":"nginx"
    }],
    "onstart":true
 }]

How to use

Command Line

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

Use with docker-compose

  1. 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 in my_dir directory, you probably has network my_dir_default
    • otherwise read the docker-compose docs
  2. Add dockerargs to your docker-crontab config.json
    • use --network NETWORK_NAME to connect new container into docker-compose network
    • use --rm --name NAME to use named container
    • e.g. "dockerargs": "--network my_dir_default --rm --name my-best-cron-job"

Dockerfile

FROM willfarrell/crontab

COPY config.json ${HOME_DIR}/

Logrotate Dockerfile

FROM willfarrell/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"]

Logging - In Dev

All stdout is captured, formatted, and saved to /var/log/crontab/jobs.log. Set LOG_FILE to /dev/null to disable logging.

example: e6ced859-1563-493b-b1b1-5a190b29e938 2017-06-18T01:27:10+0000 [info] Start Cronjob **map-a-vol** map a volume

grok: CRONTABLOG %{DATA:request_id} %{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:severity}\] %{GREEDYDATA:message}

TODO