I've recently tried running a cron job from within a linked docker container and run into an issue. My main docker container is linked to a postgres container and its port number is set as an environment variable by docker upon the containers creation. This environment variable is not set in ~/.profile or any other source file that I could load when running my cron job. How can I then access these environment variables from my cron job?
Thanks!
To escape any weird characters that could break your script, and according to reasoning from Mark's answer, add this line to your
entrypoint.sh
:This way, if you have any variable like
affinity:container==My container's friend
, it will be converted toaffinity:container='=My container\'s friend
, and so on.The environment is set, but not available to the cron job. To fix that, you can do these two simple things
1) Save the env to a file in your ENTRYPOINT or CMD
2) Then read that env into your cron command like this:
I would recommend using
declare
to export your environment and avoid escaping issues (using 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:
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
run_cron.sh:
This is based on a great blog post somewhere, but I lost the link.
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.
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 withtail
running to keep the container up.Here is my entrypoint.sh file for reference and my container is a debian:jessie base image.
Also, this trick worked even with environment variables that are set during,
docker run
commands.