Python Web应用程序项目结构和Docker支持
描述
比如,我有一个下面的烧瓶项目结构:
├ 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/
我有以下要求:
- 我想用gunicorn部署在nginx后面,用rabbitmq和celery和postgresql作为数据库。 Nginx提供来自
yourapp/static
静态文件 - 我想所有的configuration都是我的代码库的一部分,例如所有的nginx,gunicorn和其他configuration应该放在同一个git仓库的某处。
- 我想使用一个docker,并有以下docker图像:Web应用程序,postgresql,Nginx,rabbitmq和芹菜工。
- 我希望能够从这个git仓库build立所有的docker图像
- 我想使用Dockerfiles
题
如果我想满足所有这些要求,我应该在哪里放置configuration文件和Dockerfiles?
附加信息
我有一些想法,但不清楚。 例如,我知道,我实际上不需要一个Dockerfile用于postgresql图像,我可以使用Docker集线器的仅音量容器和postgres图像。
我无法解决的主要问题是nginx和应用程序范围的干扰:对于nginx的Dockerfile应该可见静态文件,对于gunicorn的Dockerfile也应该可以看到整个瓶子应用程序,但是我不能把2个Dockerfiles放在同一个文件夹
另一个问题,我想有文件夹的代码(yourapp)从configuration文件夹中分离出来,所有的configuration文件(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
点,他们将有权访问所有的文件。
我会把你的应用程序configuration放到一个单独的容器中,并使用volumes_from
使它可用于应用程序,以便你可以使用具有不同configuration的相同的无状态应用程序容器。
我认为这符合您的所有要求。