当前位置: 首页 > news >正文

Docker部署Flask应用

from flask import Flask
app = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'

以上代码是一个简单的Flask应用,但是在商业应用中,往往这不是最好的代码

在商业化项目中,都会降代码进行解耦,达到最大代码复用率,例如代码中的app变量,那么如何搭建大型项目结构呢?可参照以下步骤

  • Flask官方解决方案

Flask官网的解决方式将Flask应用打包进一个模块包中,然后通过setuptools setup函数启动,因为Python是不希望直接运行一个模块包的

例如:扫描二维码、条码项目

项目结构

在这里插入图片描述

application_init_.py

注意:这里必须引入使用了app子文件

from flask import Flask# 定义app
app = Flask(__name__)# 引入子模块
import application.scancode

application\scancode.py

from flask import  requestimport cv2
import base64
import numpy as np# 引入模块包中的app
from application import app# 扫描二维码
@app.route('/scancode/scanQrcode', methods=['POST'])
def scan_qrcode():base64_str = request.json.get('image')nparr = np.frombuffer(base64.b64decode(base64_str), np.uint8)# 读取图像image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)code_detector = cv2.QRCodeDetector()decodes = code_detector.detectAndDecodeMulti(image)return {'data': decodes[1], "points": decodes[2].tolist()}# 扫描条形码
@app.route('/scancode/scanBarcode', methods=['POST'])
def scan_barcode():base64_str = request.json.get('image')nparr = np.frombuffer(base64.b64decode(base64_str), np.uint8)# 读取图像image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)code_detector = cv2.barcode.BarcodeDetector()decodes = code_detector.detectAndDecodeMulti(image)return {'data': decodes[1], "points": decodes[2].tolist()}

setup.py

from setuptools import setup, find_packagessetup(name='application',version='1.0.0',setuptools='xx',packages=find_packages(),include_package_data=True,install_requires=['flask==3.1.1','opencv-python-headless==4.11.0.86'],
)

服务运行启动命令

# 这里的yourapplication使用项目结构中的目录名称,也就是__init__.py所在的目录
export FLASK_APP=application
pip install -e .
flask run

构建 Docker

Dockerfile

FROM python:3.9-slimWORKDIR /appCOPY . /appRUN python -m venv venv
RUN . venv/bin/activate
RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/EXPOSE 5000

构建镜像

# 获取版本号
version=$(cat setup.py | grep version | head -n 1 | awk -F '=' '{ print $2 }' | tr -d "[',]")docker rmi -f ${image_name}:$version
docker rmi -f ${image_name}:latest# 构建镜像
docker build -t ${image_name}:$version -t ${image_name}:latest .# 推送镜像
docker push ${image_name}:$version
docker push ${image_name}:latest

运行镜像

# 最后一定要指定主机IP为0.0.0.0,不然外部无法访问到容器内部的服务,如果像定义端口还可以用-p参数指定端口号,更多信息可运行flask run --help查看
docker run -d --name service - ${image_name}:latest /bin/sh -c 'export FLASK_APP=application && pip install -e . && flask run -h 0.0.0.0'
http://www.lqws.cn/news/513469.html

相关文章:

  • Android14音频子系统-Linux音频子系统ALSA
  • 微信小程序 / UNIAPP --- 阻止小程序返回(顶部导航栏返回、左 / 右滑手势、安卓物理返回键和调用 navigateBack 接口)
  • 服务器性能优化通用方案
  • 文档处理控件Aspose.Words教程:在.NET中将多页文档转换为单个图像
  • 【开源解析】基于PyQt5的智能费用报销管理系统开发全解:附完整源码
  • Golang单例实现
  • LVS-NAT负载均衡群集实战:原理、部署与问题排查
  • 小程序快速获取url link方法,短信里面快速打开链接
  • Spark Streaming 与 Flink 实时数据处理方案对比与选型指南
  • Flink2.0 配置 historyserver
  • 15个AI模拟面试平台 和 简历修改 / 真人面试平台
  • 云计算产业链
  • 用wordpress建日语外贸网站的优势
  • C# Avalonia 绑定模式 Mode 的区别,它们的应用场景
  • spring中的@Cacheable缓存
  • MicroPython网络编程:AP模式与STA模式详解
  • 【笔记——李沐动手学深度学习】2.3 线性代数
  • 【Python练习】012. 使用字符串的upper()方法将字符串转换为大写
  • 基于开源AI大模型、AI智能名片与S2B2C商城小程序的美食菜单社交化营销创新研究
  • 音频转换芯片DP7344兼容CS4344双通道24位DA转换器技术资料
  • 宠物养成小游戏流量主微信小程序开源
  • 小米互联应用曝高危漏洞,攻击者可绕过认证获取设备完全控制权
  • 使用GithubActions和腾讯CloudBase自动发布静态网页
  • 暴雨信创电脑代理商成功中标长沙市中医康复医院
  • 019 高校心理教育辅导系统技术解析:构建心理健康守护平台
  • aspose.word在IIS后端DLL中高并发运行,线程安全隔离
  • HarmonyNext动画大全02-显式动画
  • 从数据到决策:UI前端如何利用数字孪生技术提升管理效率?
  • 计算机网络 网络层:数据平面(二)
  • LeetCode 142题解 | 环形链表Ⅱ