Fab*_*ger 40 cron environment-variables docker
我最近尝试从链接的docker容器中运行一个cron作业并遇到问题.我的主docker容器链接到postgres容器,其端口号在创建容器时由docker设置为环境变量.此环境变量未在〜/ .profile或运行我的cron作业时可以加载的任何其他源文件中设置.那我怎样才能从我的cron作业中访问这些环境变量?
谢谢!
Tim*_*ben 44
我遇到了同样的问题.我有一个运行cron的docker容器,可以定期执行一些shell脚本.当我在容器内手动执行它们时,我也很难找到为什么我的脚本运行正常.我尝试了创建一个首先运行以设置环境的shell脚本的所有技巧,但它们从来没有为我工作(很可能我做错了).但是我继续寻找并找到了它,它确实有效.
printenv | grep -v "no_proxy" >> /etc/environment这里的诀窍是/etc/environment文件.当容器构建成文件为空时,我是故意的.我在cron(8)的手册页中找到了对该文件的引用.在查看了cron的所有版本之后,他们都会找到一个/etc/?可用于将环境变量提供给子进程的文件.
另外,请注意我创建了我的docker容器以在前台运行cron cron -f.这有助于我避免tail运行以保持容器的其他技巧.
这是我的entrypoint.sh文件供参考,我的容器是debian:jessie基本图像.
printenv | grep -v "no_proxy" >> /etc/environment
cron -f
Run Code Online (Sandbox Code Playgroud)
此外,这个技巧甚至适用于在docker run命令期间设置的环境变量.
Ale*_*lov 16
我建议使用declare导出您的环境并避免转义问题(使用CMD或ENTRYPOINT或直接在其中一个可能调用的包装脚本中):
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
Grep -v负责过滤掉只读变量.
您可以稍后轻松加载此环境,如下所示:
SHELL=/bin/bash
BASH_ENV=/container.env
* * * * * root /test-cron.sh
Run Code Online (Sandbox Code Playgroud)
小智 6
通过使用包装 shell 脚本运行 cron 守护进程,可以将系统环境变量附加到 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 Code Online (Sandbox Code Playgroud)
运行_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
Run Code Online (Sandbox Code Playgroud)
这是基于某个地方的一篇很棒的博客文章,但我丢失了链接。
受到@Kannan Kumarasamy 回答的启发:
for variable_value in $(cat /proc/1/environ | sed 's/\x00/\n/g'); do
export $variable_value
done
Run Code Online (Sandbox Code Playgroud)
我无法确定 pid1 是什么进程,并且它在操作系统的生命周期内保持稳定。但由于它是第一个要运行的进程,在容器内我想我们可以理所当然地认为它是一个设置了所需环境变量的进程。除非一些 linux/docker 文档证明这完全没问题,否则请对所有这些都持怀疑态度。
您可以运行以下命令
. <(xargs -0 bash -c 'printf "export %q\n" "$@"' -- < /proc/1/environ)
Run Code Online (Sandbox Code Playgroud)
当您的环境变量具有特殊字符(例如' " =
| 归档时间: |
|
| 查看次数: |
10905 次 |
| 最近记录: |