【问题标题】:Add cronjob and flask server in same docker image在同一个 docker 镜像中添加 cronjob 和 flask 服务器
【发布时间】:2021-05-28 08:46:26
【问题描述】:

我正在尝试在同一个 docker 映像中添加 cronjob 和 flask 服务器。我的 Dockerfile 看起来像这样

FROM python:alpine3.9
RUN apk --update add build-base libffi-dev openssl-dev curl
ADD crontab.txt /crontab.txt
ADD cronscript.sh /cronscript.sh
COPY entry.sh /entry.sh
RUN chmod 755 /cronscript.sh /entry.sh
RUN /usr/bin/crontab /crontab.txt
RUN /bin/sh /entry.sh
WORKDIR /
RUN mkdir app
COPY requirements.txt /app
RUN pip install -r /app/requirements.txt
COPY *.py /app/
WORKDIR /app
RUN chmod +x main.py
ENTRYPOINT [ "python" ]
CMD [ "main.py" ]

cronscript.sh

#!/bin/sh
echo "Starting cronjob"
curl http://localhost:4000/health
echo "Completed cronjob"

crontab.txt

*/15 * * * * /cronscript.sh >> /var/log/cron.log

entry.sh

#!/bin/sh
# start cron
/usr/sbin/crond -l 2

这不会启动 cronjob。等了一个小时后,我在/var/log/cron.log 中没有看到任何数据。

好像我在烧瓶主函数中移动了/bin/sh /entry.sh 行。一切正常。

烧瓶主函数

if __name__ == "__main__":
  os.system("/bin/sh /entry.sh")
  app.run(host='0.0.0.0', port=4000, debug=True)

有没有办法让这个 cron 工作从 Dockerfile 本身而不是 python 代码工作?这感觉就像一个 hack。

【问题讨论】:

  • 在两个独立的容器中运行两个独立的进程会更容易(它们可以基于同一个镜像)。但是,您拥有的ENTRYPOINT 没有意义,并且使这变得更加困难;编写一个CMD python main.py(没有ENTRYPOINT),您可以单独docker run your-image crond -f覆盖该命令。
  • @DavidMaze 这应该可以。但我正在检查是否可以在单个 Dockerfile 中使用其他内容进行 cronjob。

标签: python docker cron dockerfile


【解决方案1】:

您必须添加额外的行以使其 cron 有效。请查看(https://blog.knoldus.com/running-a-cron-job-in-docker-container/)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2018-03-22
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多