How can I access Docker set Environment Variables From a Cron Job How can I access Docker set Environment Variables From a Cron Job docker docker

How can I access Docker set Environment Variables From a Cron Job


I ran into this same problem. I have a docker container that runs cron to execute some shell scripts periodically. I too had a hard time finding out why my scripts would run fine when I manually executed them inside the container. I tried all the tricks of creating a shell script that would run first to set the environment, but they never worked for me (most likely I did something wrong). But I continued looking and found this and it does work.

  1. Setup a start or entry point shell script for your cron container
  2. Make this the first line to execute printenv | grep -v "no_proxy" >> /etc/environment

The trick here is the /etc/environment file. When the container is built that file is empty, I think on purpose. I found a reference to this file in the man pages for cron(8). After looking at all the versions of cron they all elude to an /etc/? file that you can use to feed environment variables to child processes.

Also, note that I created my docker container to run cron in the foreground, cron -f. This helped me avoid other tricks with tail running to keep the container up.

Here is my entrypoint.sh file for reference and my container is a debian:jessie base image.

printenv | grep -v "no_proxy" >> /etc/environmentcron -f

Also, this trick worked even with environment variables that are set during, docker run commands.


I would recommend using declare to export your environment and avoid escaping issues. Can be used in CMD or ENTRYPOINT or directly in a wrapper script which might be called by one of them:

declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env

Grep -v takes care of filtering out read-only variables.

You can later easily load this environment like this:

SHELL=/bin/bashBASH_ENV=/container.env* * * * * root /test-cron.sh


One can append the system environment variables to the top of a crontab file by using wrapper shell script to run the cron daemon. The following example is from CentOs 7,

In the Dockerfile

COPY my_cron /tmp/my_cronCOPY bin/run-crond.sh run-crond.shRUN chmod -v +x /run-crond.shCMD ["/run-crond.sh"]

run_cron.sh:

#!/bin/bash# prepend application environment variables to crontabenv | egrep '^MY_VAR' | cat - /tmp/my_cron > /etc/cron.d/my_cron# Run cron deamon# -m off : sending mail is off # tail makes the output to cron.log viewable with the $(docker logs container_id) command/usr/sbin/crond -m off  && tail -f /var/log/cron.log

This is based on a great blog post somewhere, but I lost the link.