基于 docker 打包部署 python web 项目至 linux 服务器
文章目录
将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/*
,这样每次打包镜像过程中就不需要重新下载依赖包,直接本地安装即可。
文章作者 honour
上次更新 2018-06-13