首页 > 解决方案 > 在容器化网站中临时存储图像数据的最佳方式是什么?

问题描述

我目前正在一个网站上工作,我希望用户上传一张或多张图片,我的烧瓶后端将对这些图片进行一些更改,然后将它们返回到前端。

我在哪里最好暂时保存这些图像,特别是如果我的网站上同时有多个用户(我计划将网站容器化)。将图像保存在网站的文件夹中对我来说是否安全,或者我是否需要一个数据库?

标签: pythonflask

解决方案


您应该使用数据库或外部对象存储,如 Amazon S3。

我这么说有几个原因:

事故确实发生。 假设客户端执行 HTTP POST,获取 URL,然后执行 HTTP GET 以检索结果。但与此同时,容器重新启动(因为系统崩溃;您的云实例被终止;您重新启动容器以升级其映像;应用程序失败);容器临时文件系统将丢失。

工作人员可以在单独的容器中运行。 将此应用程序构建为前端 Web 服务器是非常合理的,它将消息推送到作业队列中,然后后端工作人员从该队列中提取消息以处理图像。主服务器和工作人员将拥有独立的容器本地文件系统。

你可能想扩大这部分。 您可以轻松地从同一个镜像运行多个容器;它们每个都有单独的容器本地文件系统,您不会直接控制请求发送到哪个副本,因此每个容器都需要访问相同的底层存储。

...而且它可能不在同一个主机上。 特别是,像 Kubernetes 或 Docker Swarm 这样的集群技术使得运行跨多个系统的基于容器的应用程序变得相当简单;即使在这些环境中,在主机之间共享文件也并不简单。(大多数容易获得的 Kubernetes 卷类型不能跨多个主机使用,除非您设置单独的 NFS 服务器。)

这组约束意味着尽量避免命名卷。使用卷作为数据库的底层存储是有意义的,使用 Docker 绑定挂载来注入配置文件或获取日志文件是有意义的,但理想情况下,您的容器根本不真正使用其本地文件系统并且不不在乎自己运行了多少个副本。

(不要依赖Docker 在首次使用时填充命名卷的行为。它存在三个大问题:它仅在首次使用时,因此如果您更新底层映像,则该卷不会被更新;它只能工作使用 Docker 命名卷,而不是绑定挂载等其他选项;它仅适用于 Docker,不适用于 Kubernetes。)

给定其他约束集,其他决策也是可能的。如果您绝对确定您永远不会想要跨多个节点运行此应用程序,那么 Docker 卷或绑定挂载可能是有意义的。我仍然会避免使用容器临时文件系统。


推荐阅读