将Python Web应用容器化

本文将讨论如何让“容器化”的Python Web应用跑在安全的沙箱里,严格的坚守在其各自的环境中(当然,除非你指定它们与其他应用进行“连接”)。

以下将介绍两站方法如何创建一个Docker容器,如何用这个容器来跑我们的Python Web应用,以及如何用一个Dockerfile来描述整个构建过程以实现完整的自动化。

方法一

我们这个flask python web应用的文件组织结构是这样的:

|-app/
    |-templates/  # 用于存储渲染的模板
    |-static/  # 用来存储静态文件
    |-main/
        |-__init__.py
        |-errors.py
        |-forms.py
        |-views.py
    |-__init__.py
    |-email.py
    |-models.py
|-migrations/   # 包含数据库迁移脚本
|-tests/  # 单元测试编写在 tests 包中
    |-__init__.py
    |-test*.py
|-venv/  # venv 文件夹包含 Python 虚拟环境
|-requirements.txt  # 描述依赖项的文件
|-config.py  # 存储配置
|-manage.py  # 用于启动程序以及其他的程序任务

初次打包,请在程序入口文件manage.py路径下打开终端,键入以下命令(注意,请将命令最后一行替换为入口文件的名称,以及,请确requirements.txt中没有多余的包,以节约打包时间以及避免打包冲突)

docker run —rm \
    -v "${PWD}:/src" \
    tyrodw/pyinstaller-alpine \
    --noconfirm \
    --onefile \
    --log-level DEBUG \
    --clean \
    manage.py

因为网络原因下载依赖包可能会花费较长时间请耐心等待,打包完成后会在项目入口文件路径下生成dist、build文件夹和manage.spec文件以及__pycache__文件夹,其中在dist文件夹中会有打包后的单个可执行文件,文件名和web应用入口文件名一致,此处为manage。在下次执行打包命令前请务必删除打包生成的相关文件。Mac用户可保存以下指令至脚本执行即可清理。

#!/bin/bash

find ./ -name '__py*' | xargs rm -rf
rm -rf dist build *.spec

至此,请将打包出的单个可执行文件,此处为manage移动至任意文件夹,在此路径下创建Dockerfile文件,内容如下:

FROM alpine:3.7

WORKDIR /appa

ADD . /appa

EXPOSE 5000

CMD ["./manage"]

在此路径打开终端,键入docker build -t python-test:first .即可打包至本地的docker,镜像名python-test,版本号tag为first

方法二

在项目入门文件manage.py路径下,创建Dockerfile文件,内容如下:

FROM python:3.6

WORKDIR /app

ADD . /app

ENV http_proxy 0.0.0.0:5000

RUN pip install --trusted-host pypi.python.org -r requirements.txt

EXPOSE 5000

CMD ["python","manage.py","runserver"]

在此路径打开终端,键入docker build -t python-test:first .即可打包至本地的docker,镜像名python-test,版本号tag为first

注意:由于网络原因以及python3镜像较大(约1G左右),以及项目依赖包可能较多等原因,打包可能比较慢请耐心等待。(只有在初次打包会从服务器下载python3镜像)

缩短打包时间的策略

在方法二中,每次打包都需要重新下载项目所需python依赖包,为减少打包时间,可提前将依赖包下载至本地即可,具体步骤如下:

请先确保项目根路径下有记录项目依赖包描述的requirements.txt文件,在该路径下打开终端执行以下命令 :

pip3 download -d "requirements" --trusted-host pypi.python.org -r "requirements.txt"

该命令会下载项目全部依赖包至”requirements”文件夹。

因为网络原因,建议将默认下载源pypi.python.org更换为国内镜像源:

阿里云 http://mirrors.aliyun.com/pypi/simple/

中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

豆瓣(douban) http://pypi.douban.com/simple/

清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/

中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

现在可将Dockerfile文件里的以下内容:

RUN pip install --trusted-host pypi.python.org -r requirements.txt

替换为RUN pip install requirements/*,这样每次打包镜像过程中就不需要重新下载依赖包,直接本地安装即可。