Docker容器运行时的环境变量文件

2024-01-05

我有一个 docker 映像,它基本上按照使用下面构建映像时定义的频率安排 cron 作业。

COPY myjobtime /etc/cron.d/myjobtime
RUN chmod 0644 /etc/cron.d/myjobtime &&\
    crontab /etc/cron.d/myjobtime
CMD cron 

我的文件 myjobtime.txt 中有 cron 条目。

*/10 * * * * /usr/local/bin/sh /app/myscript.py

我希望能够在运行时传递 cron 计划。这意味着,如果有人想要将 cron 计划修改为不同的频率,他们应该能够在运行容器并传递包含新 cron 计划的环境变量文件时执行此操作。这可以做到吗?


重要的细节是,您需要在容器启动时创建并安装 crontab 文件。我发现入口点包装脚本是一个有用的模式:设置图像的ENTRYPOINT成为一个执行首次设置所需的 shell 脚本,然后拥有它exec "$@"运行图像的CMD.

如果您的映像最终基于基于 GNU 工具集的 Linux 发行版,那么envsubst https://www.gnu.org/software/gettext/manual/html_node/envsubst-Invocation.html这是一个非常有用的程序。它读入文本文件,扩展环境变量引用,然后写出结果。我假设你有这个可用的;在基于 Alpine 的图像上,您可以使用类似的技巧sed(1)(尽管绕过 cron 计划会变得很棘手)。

这使得入口点包装器脚本类似于:

#!/bin/sh
# entrypoint.sh

# Set a default schedule, if the user didn't provide one
if [ -z "$CRON_SCHEDULE" ]; then
  export CRON_SCHEDULE='*/10 * * * *'
fi

# Run substitutions on the template file and inject the crontab
envsubst < /app/myjobtime.cron.tmpl | crontab

# Run the main container command
exec "$@"

由于模板不是“普通”crontab,因此它不能进入​​“普通”crontab 目录;把它放在应用程序目录中就可以了。该文件有一个环境变量引用,计划将在其中进行

# myjobtime.cron.tmpl
${CRON_SCHEDULE} /app/myscript.py

在您的图像中,将包装脚本设置为ENTRYPOINT,确保模板文件位于正确的位置,然后保留CMD不变。

# (assuming there's not a broad `COPY . .`)
COPY myjobtime.cron.tmpl .
COPY entrypoint.sh .

ENTRYPOINT ["/app/entrypoint.sh"] # must be JSON-array syntax
CMD cron                          # unchanged

这应该允许您覆盖 cron 计划。

docker run -d --name hourly myappcron
docker run -d --name daily -e 'CRON_SCHEDULE=0 0 * * *' myappcron

由于入口点包装器脚本运行提供的任何命令,并且您可以非常轻松地覆盖该命令,这还可以让您仔细检查是否设置了正确的计划。

docker run --rm -e 'CRON_SCHEDULE=0 0 * * *' myappcron \
  crontab -l  # runs instead of the cron daemon
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker容器运行时的环境变量文件 的相关文章

随机推荐