【问题标题】:Docker container environment variable file during runtime运行时的 Docker 容器环境变量文件
【发布时间】:2022-01-29 03:23:07
【问题描述】:

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

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

我在 myjobtime 文件中有 cron 条目。

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

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

【问题讨论】:

    标签: docker cron containers


    【解决方案1】:

    重要的细节是您需要在容器启动时创建并安装 crontab 文件。我发现一个入口点包装脚本对此很有用:将图像的ENTRYPOINT 设置为一个shell 脚本,它可以执行任何首次需要的设置,然后让它exec "$@" 运行图像的CMD

    如果您的映像最终基于基于 GNU 工具集的 Linux 发行版,那么 envsubst 在这里是一个非常有用的程序。它读入一个文本文件,扩展环境变量引用,并写出结果。我假设你有这个可用;在基于 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
    

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 2017-05-11
      • 2016-12-28
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      • 2019-02-21
      相关资源
      最近更新 更多