如何从停靠的Python web应用程序提供静态文件?

如何从停靠的Python web应用程序提供静态文件?,python,docker,containers,portability,dockerfile,Python,Docker,Containers,Portability,Dockerfile,我有一个位于Nginx后面的pythonweb应用程序,通过Gunicorn提供服务 我已经对其进行了配置,使Nginx直接从磁盘上接收静态文件,并且它只与Gunicorn对话以获取静态资产,如图像 我的问题: 将web应用程序与静态资产固定在一起是一个好主意还是一个很大的“否” 如果我想在需要访问相同资产的两台服务器中部署容器,如何使静态资产像容器化应用程序一样可移植 如果可能,我想要什么: 我想把我的应用程序放在一个容器中,我想让它尽可能的便携,而不需要花费更多的资金在额外的资源上,比如一个

我有一个位于Nginx后面的pythonweb应用程序,通过Gunicorn提供服务

我已经对其进行了配置,使Nginx直接从磁盘上接收静态文件,并且它只与Gunicorn对话以获取静态资产,如图像

我的问题:

  • 将web应用程序与静态资产固定在一起是一个好主意还是一个很大的“否”

  • 如果我想在需要访问相同资产的两台服务器中部署容器,如何使静态资产像容器化应用程序一样可移植

  • 如果可能,我想要什么:


    我想把我的应用程序放在一个容器中,我想让它尽可能的便携,而不需要花费更多的资金在额外的资源上,比如一个单独的服务器来保存图像(比如一个DB)

    如果你知道你的应用程序将永远拥有相同的静态资产,那么就用应用程序将它们封装起来,然后用它来完成

    但情况会发生变化,所以当你需要它时,我会推荐一种方法:将你的静态资产放在一个DVC中,并将该DVC安装在主容器中,这样它几乎就是“一个应用程序容器”。您可以使用Docker编写如下内容:

    appdata:
        image: busybox
        volumes:
            - /path/to/app/static
        command: echo "I'm just a volume container"
    app:
        build: .
        volumes_from:
            - appdata
        command: …
    

    通过使用引导脚本启动容器,可以进一步扩展,该脚本在启动时将初始静态文件复制到目标路径。这样,你的应用程序就可以保证总是有一个默认设置来启动,但是随着应用程序的增长,你可以添加更多的静态文件。举个例子,拉动官方Jenkins容器并阅读
    /usr/local/bin/Jenkins.sh

    我同意kojiro的观点,如果情况没有太大变化,用你的应用程序将静态文件封装起来。关于第二个问题,您似乎认为Docker卷容器方法仍然不够灵活,因为您将拥有多个Docker主机。也许Flocker满足了您的需求?从Flocker文档()中:

    Flocker允许您将Docker容器及其数据一起移动 在Linux主机之间。这意味着您可以运行数据库, 队列和Docker中的键值存储,并尽可能轻松地移动它们 作为应用程序的其余部分。即使是无状态的应用程序也依赖于许多有状态的应用程序 服务,并且当前正在中的Docker容器中运行这些服务 生产几乎是不可能的。Flocker旨在通过以下方式解决此问题: 提供一个编排框架,允许您同时移植 环境之间的有状态和无状态容器


    这听起来是个好主意。我将检查DVC方法。同时,如果可以的话,你能否详细说明一下答案,重点是如何处理一个web应用程序可能拥有的上传图像?想象一下,将产品图片或图片添加到博客帖子中,这样可以像多台机器上的容器一样进行扩展(可移植性),并且可以方便地从一台机器传送到另一台机器。如何做到这一点?谢谢@Phil如果您只有一台Docker主机,那么您的所有应用程序容器都可以共享DVC以访问静态媒体。如果您有多个Docker主机,就像大多数大规模生产Docker系统一样,那么答案是非平凡的。前者是“非平凡的”。后者是我在最初的问题中要学习和理解的。ikkjo,假设这是一个比以前更普遍的问题,安全吗?移植/共享/服务不断变化的静态资产(如上传的图像)?我将查看flocker btw-->谢谢!至少从我的理解来看,这个问题并没有得到普遍解决。我也不确定会不会这样。即使您在没有docker的传统集群上运行,根据您的需要,您在数据和数据复制方面也会有不同的选择,我想在docker世界中也是如此,在docker世界中,实现是不同需求之间的权衡。我明白了。因此,我们开始在CDN上投入大量资金。