【问题标题】:Python web application project structure and docker supportPython Web 应用程序项目结构和 docker 支持
【发布时间】:2015-12-24 07:50:29
【问题描述】:

说明

例如,我有以下烧瓶项目结构:

├ 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. 我希望所有配置都成为我的代码库的一部分,例如所有 nginx、gunicorn 和其他配置都应该放在同一个 git 存储库中的某个位置。
  3. 我想使用 docker 并拥有以下 docker 镜像:web-app、postgresql、nginx、rabbitmq 和 celery-worker。
  4. 我希望能够从这个 git 存储库构建所有 docker 映像
  5. 我想使用 Dockerfiles

问题

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

其他信息

我有一些想法,但不清楚。例如,我知道,我实际上不需要 Dockerfile 来存储 postgresql 映像,我可以使用 Docker hub 中的仅卷容器和 postgres 映像。

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

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

【问题讨论】:

    标签: python deployment configuration flask docker


    【解决方案1】:

    我会使用 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 使其可供应用程序使用,以便您可以使用具有不同配置的同一个无状态应用程序容器。

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

    【讨论】:

      猜你喜欢
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 2014-04-15
      相关资源
      最近更新 更多