用docker构建并启动fastapi项目

发布于 2025年07月13日

场景说明

由于最近在搞验证码识别,是用ddddocr项目实现的,因为是py实现的,作为一个js选手,对这些py项目部署感觉十分吃力,所以记录一下。

资料准备

  • FastApi基础模板
  • Dockerfile文件
  • ubuntu环境+docker
  • charsets.json
  • xxxxx.onnx

模板文件

文件:main.py,内如如下

import base64
import logging

import ddddocr
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()
ocr = ddddocr.DdddOcr(det=False, ocr=False, import_onnx_path="yingshu4_3.onnx", charsets_path="charsets.json")
# ocr = ddddocr.DdddOcr()

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


class JsonModel(BaseModel):
    base64_text: str


@app.get("/")
async def root():
    return {"message": "Hello World"}


@app.post("/cnn/vcode")
async def vcode(post_data: JsonModel):
    logger.info("接收到验证码识别请求")
    try:
        # 打印接收到的base64前50个字符
        logger.debug(f"Base64数据: {post_data.base64_text[:50]}...")

        # 解码Base64图像
        image_bytes = base64.b64decode(post_data.base64_text)

        # OCR识别
        vcodeText = ocr.classification(image_bytes)
        logger.info(f"识别成功: {vcodeText}")

        return {"vcode": vcodeText}

    except base64.binascii.Error as e:
        logger.error(f"Base64解码失败: {str(e)}")
        raise HTTPException(status_code=400, detail="Invalid base64 string")

    except Exception as e:
        logger.error(f"识别过程出错: {str(e)}", exc_info=True)
        return {"vcode": "-1"}


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=48001)

依赖文件:requirements.txt,内容如下:

ddddocr
uvicorn
fastapi
pydantic
pydantic-settings

构建文件Dockerfile内容如下:

# 使用Python官方镜像作为基础镜像
FROM python:3.10-slim

# 设置工作目录
WORKDIR /app

# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

# 安装Python依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制项目文件
COPY . .

# 暴露服务端口(与FastAPI应用端口一致)
EXPOSE 48001

# 启动应用
CMD ["python", "main.py"]

开始构建

确保自己已经准备了charsets.json和xxx.onnx

构建镜像:

docker build -t fastapi-ocr .

启动镜像:

docker run -d -p 48001:48001 --name fastapi-ocr fastapi-ocr


评论