Public | Automated Build

Last pushed: 5 months ago
Short Description
crontab for docker
Full Description


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

Supported tags and Dockerfile links


Yes, I'm aware of mcuadros/ofelia (280MB), 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 actually does.
  • Start an image using image.
  • Run command in a container using container.
  • Run command on a instances of a scaled container using project.
  • Ability to trigger scripts in other containers on completion cron job using trigger.


  • 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 Ex @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.
  • project: Docker Compose/Swarm project name. Optional, only applies when contain is included.
  • container: Full container name or container alias if project is set. Ignored if image is included. Optional.
  • dockerargs: Command line docker run/exec arguments for full control. Defaults to .
  • trigger: Array of docker-crontab subset objects. Subset includes: image,project,container,command,dockerargs
  • onstart: Run the command on crontab container start, set to true. Optional, defaults to falsey.

See config.sample.json 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",
         "command":"sh -c '/etc/scripts/make_hpkp ${NGINX_DOMAIN} && /usr/sbin/nginx -t && /usr/sbin/nginx -s reload'",

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 \


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}


  • [ ] Have ability to auto regenerate crontab on file change (signal HUP?)
  • [ ] Run commands on host machine (w/ --privileged?)
  • [ ] Write tests
  • [ ] Setup TravisCI
Docker Pull Command
Source Repository