我正在设置一个 docker 容器,它需要 cronjob 来使用awscli
.
我在 cron 作业无法访问 docker 容器的环境变量时遇到问题。当我在启动时工作时,我将所有环境变量打印到文件中printenv > /env
。
当我尝试source
从 cron 作业使用时(我直接在 crontab 和 crontab 调用的脚本中尝试过),它似乎不起作用。
我制作了项目的简化版本来演示该问题(包括rsyslog
用于日志记录):
Dockerfile:
FROM debian:jessie
# Install aws and cron
RUN apt-get -yqq update
RUN apt-get install -yqq awscli cron rsyslog
# Create cron job
ADD crontab /etc/cron.d/hello-cron
RUN chmod 0644 /etc/cron.d/hello-cron
# Output environment variables to file
# Then start cron and watch log
CMD printenv > /env && cron && service rsyslog start && tail -F /var/log/*
定时任务:
# Every 3 minutes try to source /env and run `aws s3 ls`.
*/3 * * * * root /usr/bin/env bash & source /env & aws s3 ls >> /test 2>&1
当我启动容器时,我可以看到/env
是用我的变量创建的,但它永远不会被获取。
答案1
首先,命令的(好吧,shell 内置命令)名称是source
。除非您编写了一个名为 的脚本source
并将其放入/
,否则您想要source
而不是/source
。
下一个问题是,cron
通常使用你拥有的任何东西,/bin/sh
并且source
是 bashism (或其他更复杂的 shell)。便携式、符合 POSIX 标准的命令源文件是.
.所以,尝试这样做而不是source
:
*/3 * * * * root /usr/bin/env bash & . /env & aws s3 ls >> /test 2>&1
另外,我不太明白那应该做什么。启动 bash 会话并将其发送到后台有什么意义?如果您想使用 bash 运行后续命令,您需要:
*/3 * * * * root /usr/bin/env bash -c '. /env && aws s3 ls' >> /test 2>&1
我也将其更改为,&
因为&&
据我所知,在后台进行采购是毫无意义的。
答案2
您可以使用.
since作为特登的回答已经提到 cron/bin/sh
默认使用并且有时不识别source
命令。
我想再添加一件事:您无法获取文件并在第二个命令中使用它,因此这样的操作可能不起作用:
* * * * * source ~/.bash_profile
* * * * * do some stuff with bash_variables
因为每一行都是会话本身,所以第一个命令中的源变量在后面的命令中将不可用。你必须这样做:
* * * * * source ~/.bash_variable && do some stuff with bash_variables