在Docker容器内进行定期清理的最佳方法是什么?

时间:2018-11-26 16:00:35

标签: docker cron uwsgi

我有一个docker容器,该容器在debian和python脚本上使用uwsgi运行一个简单的自定义下载服务器。将针对每个请求生成文件并将其保存在容器内。现在,我要定期删除服务器为过去的请求生成的旧文件。

到目前为止,我是通过主机上的 cronjob 实现清理的,

*/30 * * * *   docker exec mycontainer /path/on/container/delete_old_files.sh

但这有一些缺点:

  • Cron需要在Docker主机上安装并运行
  • 用户必须为其启动的每个容器手动添加一个cronjob
  • 源代码中还有一个额外的清理脚本
  • 需要cron作业的事实需要记录在案

我更喜欢随docker容器一起推出的解决方案,并且也适用于docker容器背景下的更常规的定期任务。

是否有任何最佳做法?

python或uwsgi是否具有用于定期后台任务的简单机制?

我知道,我可以在容器中安装cron并安装到类似CMD ['sh', '-c', 'cron; uswgi <uswgi-options>... --wsgi-file server.py']的地方,但这似乎有点笨拙,并且与docker philosopy背道而驰。

server.py中的解决方案:

def cleanup():
    # ...
    threading.Timer(30*60, cleanup).start() # seconds...

cleanup()

# ... rest of the code here ...

看起来不错,但是我不确定它如何干扰uwsgi自己的线程和处理。

这似乎是一个简单的问题,但不是。

1 个答案:

答案 0 :(得分:0)

您应该将实时数据存储在容器中。容器可能会有些脆弱,需要定期删除和重新启动(因为您忘记了一个选项;因为基础映像具有关键的安全修复程序),一旦发生这种情况,您将丢失容器中的所有数据。

相反,您可以使用docker run -v选项将数据存储在主机上的路径中。如果它们都在同一个地方,那么您可以进行一项cron工作来清理它们。在主机上运行cron可能是这里的正确解决方案,尽管原则上您可以有一个单独的专用cron容器来进行清理。