一个Python程序是如何在DINP上跑起来的

UlricQin 发布于 2015/02/09 19:04
阅读 835
收藏 4

以此文来阐述平台打包工作机理。demo项目的代码在:https://github.com/dinp/dinp-demo-python-flask

# Python项目的特点

Python的web项目,通常使用一些框架,比如Flask、web.py之类的。使用一些WSGI服务器,比如gunicorn驱动。可能会用到一些lib库,比如requests之类的,通常使用pip之类的安装。Python不比Golang那种静态编译的语言,扔一个二进制包给OS就可以跑起来了,还是需要Python的语言环境。

所以说,要想把一个Python的项目跑起来,需要以下组件:

- Python语言环境
- 用户的code
- 依赖的lib库
- WSGI HTTP Server

# 设计思路

最终我们要把run这个Python项目所需的一切依赖都打包进一个Docker image,单机拉取这个image即可创建container。heroku和CloudFoundry采用的是buildpack,最终生成的是droplet,用户需要在manifest.yml中指定依赖的Python语言版本,然后平台在stage的阶段从远端拉取相应版本的dependency与用户的代码一起组装为droplet。

DINP遵从约定优于配置的原则,不给用户太多定制化的空间。

我们提前做好了一些base image,比如tomcat6有一个base image,tomcat7有一个base image,Python2.7也有一个base image,base image中提前放置了Python语言环境,提前放置了一些常见lib库,还内置了一个gunicorn。于是,用户把代码扔给Builder,Builder把用户的code和base image揉在一起就搞定了。

我们制作Python base image的Dockerfile在这里:https://github.com/dinp/Dockerfile/blob/master/python/Dockerfile

其实,这个Python base image中到底应该放置哪些内容,是值得商榷的,这个要看自己公司的情况,然后适当取舍。或者,也可以做多个base image以满足复杂需求。

# 真实实现

我们使用上面链接中的Dockerfile做了base image,用户在Builder中把自己的Python code打包上传,同时选择该base image,Builder会通过模板:https://github.com/dinp/builder/blob/master/tpls/gunicorn.tpl 生成一个新的Dockerfile,把用户的python_code.tar.gz ADD进image,搞定

最终运行的时候就是运行`{{.AppDir}}/control`这个文件,而看gunicorn.tpl你会发现,用户实际是可以覆盖这个control文件的,所以,用户是可以通过这个control文件定制所有事情

# dependency处理

base image中已经有了部分lib库 https://github.com/dinp/Dockerfile/blob/master/python/requirements.txt 但可能仍然不够,这个时候的推荐做法就是用户把依赖的lib库一起打包,就像上面给出的Python的例子一样,比如创建一个dinp目录存放各种lib源代码,然后在wsgi.py中引入进来。这样就省得在编译阶段下载了,编译速度就会很快

# 约定

项目根目录中一定要提供一个wsgi.py,wsgi.py中一定要提供一个application,因为gunicorn运行的时候就是去寻找这个application:`gunicorn wsgi:application -c gunicorn.conf --access-logfile=/opt/logs/access.log --error-logfile=/opt/logs/error.log`

感觉说得比较乱,希望能帮到大家:)

加载中
返回顶部
顶部