Flask制作python web服务并用Cython打包再放进docker运行

2024-06-04 18:18

本文主要是介绍Flask制作python web服务并用Cython打包再放进docker运行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目需求

  • 提供web api服务
  • Cython打包
  • 放进docker
  • 部署在服务器上

1. 本地开发api

# -*- coding: utf-8 -*-
"""
一个简单的demo
Created on Mon Jan 10 11:39:08 2022
@author: Lenovo
"""
from flask import Flask, make_responseapp = Flask(__name__)
@app.route('/', methods=['GET'])
def hello_world():txt = 'Hellow World, this is my first docker api server'print(txt)response = make_response(txt)return responseif __name__ == '__main__':app.run('0.0.0.0', port=5000, debug=False, threaded=True)

本地跑通就可以尝试用Cython打包了。

2. Cython打包

Cython打包目的 1:隐藏源代码 2:提高运行效率
先在服务器上安装Cython

pip install Cython==0.29.26

编辑一个新的setup.py文件

# -*- coding: utf-8 -*-
from distutils.core import setup
from Cython.Build import cythonize
'''
apiTest.py是需要打包的文件名,若有多个py文件可以放进循环依次打包
'''
setup(ext_modules = cythonize("apiTest.py"),  )

在终端执行:

python setup.py build

等待执行完毕就可以看一个.c文件和build目录,进入build下lib开头的目录,可以看到打包好的.so文件了,它可以直接用来python import。

直接在该目录下新建mian.py作为docker运行的入口:

import apiTestapiTest.app.run('0.0.0.0', port=5000, debug=False, threaded=True)

准备工作完成,开始打包进docker

3. 打包成docker

确定依赖的包:

pip freeze > requirements.txt

但这样会使得requirements文件很冗余,安装时容易出各种问题。
建议:直接把需要安装的包手动填进requirements。或可以采用pipreqs进行依赖库的识别,在项目的当前目录中执行
pipreqs ./ --encoding=utf8 --force,pipreqs会检索目录下所有的.py文件,并基于用到的依赖生成 requirements.txt
本demo只有:

Flask==1.1.2

然后开始编写DockerFile(直接在服务器上,无后缀)

FROM python:3.7.10
COPY . /app
WORKDIR /app
RUN pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
&& pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
EXPOSE 5000
ENTRYPOINT [“/bin/sh”, “-c”]
CMD [“python main.py”]

Dockerfile步骤解析:

  1. 以镜像python作为基础镜像,如果本地没有这个镜像,会自动从Docker Hub拉取。
    注意python的版本要和Cython打包的版本一致,不然import无法识别module。
  2. 复制Dockerfile所在目录的所有文件,包括main.py,apiTest的.so文件和requirements.txt,到容器内的虚拟目录/app中。
  3. 指定容器的默认工作目录为/app。
    RUN指令在创建镜像时执行,相当于给基础镜像增加了一个改动层,然后固化为新的只读层,添加到新的镜像中。
  4. 升级pip工具,为安装依赖包做准备(使用清华的python库镜像,提高速度)。
  5. 从requirements.txt安装python的第三方依赖包。
  6. 暴露容器的5000端口,因为本例是一个web服务,需要暴露端口。
  7. ENTRYPOINT给出程序入口命令,使容器可以表现的像一个可执行程序,本例使用sh –c作为默认程序。本来也可以使用python命令作为入口,但是容器内想使用重定位符获得输出日志,必须在sh –c “CMD”中使用重定位。这里踩坑无数,docker的容器日志用起来又太麻烦。
    可以有两种形式:
    ENTRYPOINT [“executable”, “param1”, “param2”] :推荐使用的 exec形式
    ENTRYPOINT command param1 param2 :shell 形式
  8. CMD给出容器启动时默认执行的命令,如果有ENTRYPOINT,则为ENTRYPOINT提供参数;如果没有,则是完整的默认命令。有三种形式:
    CMD [“executable”,“param1”,“param2”]:推荐使用的 exec 形式
    CMD [“param1”,“param2”]:无可执行程序形式
    CMD command param1 param2:shell 形式

在服务器上应有的文件:

  • apiTest.cpython-37m-x86_64-linux-gnu.so
  • Dockerfile
  • main.py
  • requirements.txt

在该文件夹下运行

docker build -t apitestserver:1.0 .

等待运行成功,docker就做成了。

4. 运行docker,测试

可以看到新打包的docker:

[root@host236 usr]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
apitestserver 1.0 cbe2a8f0dbd3 41 minutes ago 928MB

运行docker并暴露出端口5000:

docker run -d -p 5000:5000 apitestserver:1.0

若想进入docker:

docker run -it -p 5000:5000 apitestserver:1.0 sh

打开浏览器访问docker服务器IP:5000
在这里插入图片描述

这篇关于Flask制作python web服务并用Cython打包再放进docker运行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030753

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal