如何从Cron作业访问Docker设置环境variables

我最近尝试从链接的docker容器中运行一个cron作业,并遇到一个问题。 我的主docker容器链接到一个postgres容器,它的端口号被docker设置为一个环境variables。 这个环境variables没有在〜/ .profile中设置,或者在运行我的cron作业时可以加载的任何其他源文件中。 那么我怎样才能从我的cron作业中访问这些环境variables?

谢谢!

我遇到了同样的问题。 我有一个docker容器,它运行cron来定期执行一些shell脚本。 我也很难找出为什么我的脚本能够在容器内手动执行的时候正常运行。 我试过创build一个shell脚本的所有技巧,首先运行它来设置环境,但是他们从来没有为我工作过(很可能我做了错误的事情)。 但我继续看,发现这个,它确实工作。

  1. 为您的cron容器设置一个开始或入口点shell脚本
  2. 使这第一行执行printenv | grep -v "no_proxy" >> /etc/environment printenv | grep -v "no_proxy" >> /etc/environment

这里的技巧是/etc/environment文件。 当容器被build立的时候,那个文件是空的,我是故意的。 我在cron(8)的手册页中find了这个文件的引用。 看完所有版本的cron后,他们都逃避到/etc/? 文件,您可以使用它将环境variables提供给subprocess。

此外,请注意,我创build了我的docker容器在前台运行cron, cron -f 。 这帮助我避免了tail运行的其他技巧,以保持容器。

这里是我的entrypoint.sh文件供参考,我的容器是一个debian:jessie基础图像。

 printenv | grep -v "no_proxy" >> /etc/environment cron -f 

而且,这个技巧甚至可以在docker run命令期间设置的环境variables下工作。

通过使用包装器脚本运行cron守护进程,可以将系统环境variables追加到crontab文件的顶部。 以下示例来自CentOs 7,

在Dockerfile中

 COPY my_cron /tmp/my_cron COPY bin/run-crond.sh run-crond.sh RUN chmod -v +x /run-crond.sh CMD ["/run-crond.sh"] 

run_cron.sh:

 #!/bin/bash # prepend application environment variables to crontab env | 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 

这是基于一个伟大的博客文章的地方,但我失去了联系。

环境已设置,但cron作业不可用。 要解决这个问题,你可以做这两件简单的事情

1)将env保存到您的入口点或CMD中的文件中

 CMD env > /tmp/.MyApp.env && /bin/MyApp 

2)然后像这样读取env到你的cron命令:

 0 5 * * * . /tmp/.MyApp.env; /bin/MyApp 

为了逃避任何可能会破坏脚本的怪异字符,并根据Mark的回答推理,将此行添加到您的entrypoint.sh

 env | sed -r "s/'/\\\'/gm" | sed -r "s/^([^=]+=)(.*)\$/\1'\2'/gm" \ > /etc/environment 

这样,如果你有任何类似于affinity:container==My container's friend ,它将被转换为affinity:container='=My container\'s friend ,等等。