前言
记录一次打包Flask应用的过程,在Ubuntu(amd64)下。
虽然看着简单,但处理软件依赖和系统环境可能会遇到很多小问题,需要耐心逐个解决。
需求
打包Flask应用及其所有所需的环境为镜像,用户拉取镜像后直接运行即可使用服务。
环境依赖包含显卡驱动、编译器、所需文件和Python包等。
注意打包的机器的操作系统不很重要,但架构很重要,最好保持打包机的架构与要部署的服务器架构一致(amd64、arm64)。
有一些工具和技术可以帮助实现跨架构的镜像构建,例如 buildx 工具和多架构的 Docker 镜像。buildx 是 Docker 的官方多架构构建工具,它可以让你在一台机器上同时构建多个不同架构的镜像。多架构的 Docker 镜像则允许你在同一个镜像中包含多个架构的二进制文件,使其适用于不同的机器。
修改地址
为了使服务能够被本机外的设备访问,需要将主机地址修改为0.0.0.0
(或其他指定地址)。
方式一,在代码中指定配置:1
app.run(host='0.0.0.0')
方式二,通过终端命令指定:1
2export FLASK_RUN_HOST=0.0.0.0
flask run
显然方式二更灵活些,要修改服务的配置,直接在Dockerfile中修改就可以了。
导出Python的依赖
借助pipreqs导出依赖文件:
1 | # author: SilenceZheng66 |
编写Dockerfile
在项目根目录下创建Dockerfile。
1 | # author: SilenceZheng66 |
在修改环境变量的时候也是既可以在Dockerfile里写死,也可以通过容器运行命令docker run
的-e
参数指定。
打包镜像
进入项目根目录执行以下命令构建Docker镜像:1
docker build -t flask-api .
构建完成后可以通过docker images
查看。
运行
格式为:docker run -p host-port:container-port image-name
放在我这里映射到5001端口就是:docker run -p 5001:5000 flask-api
测试
以请求体为json格式为例:1
curl -X POST -H "Content-Type: application/json" -d @path/to/file.json URL
注意curl中@用于表示从文件中读取数据。
导出镜像
保存为压缩文件:1
docker save -o <保存路径/文件名.tar> <镜像名称:标签>
导入镜像
通过压缩文件导入:1
docker load -i <镜像文件.tar>
后记
首发于 silencezheng.top,转载请注明出处。