Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inside Docker container, cronjobs are not getting executed

Tags:

docker

cron

I have made a Docker image, from a Dockerfile, and I want a cronjob executed periodically when a container based on this image is running. My Dockerfile is this (the relevant parts):

FROM l3iggs/archlinux:latest

COPY source /srv/visitor

WORKDIR /srv/visitor

RUN pacman -Syyu --needed --noconfirm \
        && pacman -S --needed --noconfirm make gcc cronie python2 nodejs phantomjs \
        && printf "*/2 * * * *       node /srv/visitor/visitor.js \n" >> cronJobs \
        && crontab cronJobs \
        && rm cronJobs \
        && npm install -g node-gyp \
        && PYTHON=/usr/sbin/python2 && export PYTHON \
        && npm install

EXPOSE 80

CMD ["/bin/sh", "-c"]

After creation of the image I run a container and verify that indeed the cronjob has been added:

crontab -l

*/2 * * * *     node /srv/visitor/visitor.js

Now, the problem is that the cronjob is never executed. I have, of course, tested that "node /srv/visitor/visitor.js" executes properly when run manually from the console.

Any ideas?

like image 664
dlyk1988 Avatar asked Apr 01 '15 12:04

dlyk1988


People also ask

Does cron work in docker?

Since the definition of each cron job allows you to execute commands, you can use Docker Engine in the same way you would the command line.

Do Cronjobs run automatically?

The cron reads the crontab (cron tables) for running predefined scripts. By using a specific syntax, you can configure a cron job to schedule scripts or other commands to run automatically.

How do you check what Cronjobs are running?

You can use the cat, crontab and other Linux commands to view, list and display all cron jobs. The cron service searches its spool area (usually /var/spool/cron/crontabs) for crontab files (which are named after user accounts); crontabs found are loaded into memory.


1 Answers

One option is to use the host's crontab in the following way:

0 5 * * * docker exec mysql mysqldump --databases myDatabase -u myUsername -pmyPassword > /backups/myDatabase.sql

The above will periodically take a daily backup of a MySQL database.

If you need to chain complicated commands you can also use this format:

0 5 * * * docker exec mysql sh -c 'mkdir -p /backups/`date +\%d` && for DB in myDB1 myDB2 myDB3; do mysqldump --databases $DB -u myUser -pmyPassword > /backups/`date +\%d`/$DB.sql; done'

The above takes a 30 day rolling backup of multiple databases and does a bash for loop in a single line rather than writing and calling a shell script to do the same. So it's pretty flexible.

Or you could also put complicated scripts inside the docker container and run them like so:

0 5 * * * docker exec mysql /dailyCron.sh
like image 141
snez Avatar answered Oct 11 '22 17:10

snez