How to write solid cron jobs

Recently I migrate pypi-mirrors from Vultr VPS to Rancher stack, which is a pure container environment. Everything work fine, though it took me some time to setup the cron job in container correctly. And here is a short summary which might need keep in mind while using cron job inside a container.

1. Environment Variables

Since docker containers variables were set via parameters during the container start. It's not very easy be accessed from the cron job, because the environment variables are always inside the process whose pid is 1 and can not be read outside the process directly.

The work around is exporting the environment variables to a file during the entrypoint run and then source the file before the real cron job command run.

2. Use absolute path as much as possible

For example, prefer to use /usr/local/bin/python rather than python as much as possible. In most cases, this will save you time to figure out the $PATH things.

3. Do necessary logging

Output useful information to stdout/stderr, this will help you when bad thing happens.

4. Properly redirect

In most cases, using something like > /var/log/xxx.log 2>&1 would help you observe if your cron jobs are running as expected.

5. Use . instead of source

Since /bin/sh is not always equal to /bin/bash, using . to do a source is much safer.

6. Debug

If you really not sure wether your cron job is running, try to install syslog or rsyslog, then uncomment the cron related logging. Then you'll see something in /var/log/cron.log, which might be useful.