Skip to main content
 首页 » 编程设计

Python web 应用程序项目结构和 docker 支持

2024年08月25日30lyhabc

描述

例如,我有一个如下的 flask 项目结构:

├ project_root/ 
├── .gitignore 
├── README.md 
├── docs 
├── requirements.txt 
├── yourapp 
│   ├── templates/ 
│   ├── static/ 
│   ├── migrations/ 
│   ├── config.py 
│   ├── app1/ 
│   │   ├── __init__.py 
│   │   ├── controllers.py 
│   │   ├── forms.py 
│   │   └── models.py 
│   ├── app2/ 
│   │   └── ... 
│   └── app.py 
└── tests/ 

我有以下要求:

  1. 我想在 nginx 后面用 gunicorn 部署它,用 rabbitmq 和 celery 以及 postgresql 作为数据库。 Nginx 提供来自 yourapp/static
  2. 的静态文件
  3. 我希望所有配置都成为我的代码库的一部分,例如所有 nginx、gunicorn 和其他配置都应该放在同一个 git 存储库中的某个地方。
  4. 我想使用 docker 并拥有以下 docker 镜像:web-app、postgresql、nginx、rabbitmq 和 celery-worker。
  5. 我希望能够从这个 git 存储库构建所有 docker 镜像
  6. 我想使用 Dockerfiles

问题

如果我想满足所有这些要求,我应该把配置文件和 Dockerfile 放在哪里?

附加信息

有一些想法,但不是很清楚。例如,我知道我实际上不需要用于 postgresql 镜像的 Dockerfile,我可以使用来自 Docker hub 的纯卷容器和 postgres 镜像。

我无法解决的主要问题是 nginx 和应用程序范围的干扰:静态文件应该对 nginx 的 Dockerfile 可见,整个 flask 应用程序也应该对 gunicorn 的 Dockerfile 可见,但我不能放 2 Dockerfiles 在同一文件夹中。

另一个问题,我希望将带有 flask 代码的文件夹(yourapp)与配置文件夹分开,并且所有配置文件(nginx、gunicorn、celery)都应该存储在同一个文件夹中。

请您参考如下方法:

我会使用 docker-compose 并执行类似于此示例的操作 docker-compose.yml

web-app: 
    build: . 
    links: 
         - postgresql 
         - rabbitmq 
    volumes_from: 
         - config 
 
config: 
    build: . 
    dockerfile: dockerfiles/Dockerfile.config 
 
postgresql: 
    image: postgres:9.4 
    volumes_from: 
        - postgresql-data 
 
postgresql-data: 
    build: dockerfiles/postgresql-data/ 
 
nginx: 
    build: . 
    dockerfile: dockerfiles/Dockerfile.nginx 
    links: 
        - web-app 
 
rabbitmq: 
    image: rabbitmq:3.5 
 
celery-worker: 
    build: . 
    dockerfile: dockerfiles/Dockerfile.celery-worker 
    links: 
        - rabbitmq 

web-app 将使用 project_root/ 中的默认 Dockerfile,所有其他服务将使用子目录中的命名 dockerfile (它们真的可以放在你想要的任何地方,它们也可以放在根目录中)。只要 build 指向根目录,他们就可以访问所有文件。

我会将您的应用程序配置放入一个单独的容器中,并使用 volumes_from 使其可供应用程序使用,以便您可以使用具有不同配置的相同无状态应用程序容器。

我认为这可以满足您的所有要求。