Docker安装PaddleOCR并提供接口服务(CPU)

#初始化复制配置#创建数据目录

复制代码
sudo mkdir -p /app/paddle
sudo chmod -R 777 /app/paddle

#生成dockerfile

复制代码
sudo cat > /app/paddle/dockerfile <<EOF
FROM python:3.9-slim

# 设置环境变量:限制线程数,避免线程冲突导致 Paddle 崩溃
ENV OMP_NUM_THREADS=1
ENV MKL_NUM_THREADS=1
ENV FLAGS_allocator_strategy=naive_best_fit

# 安装 PaddleOCR 和 OpenCV 所需的系统库
RUN apt-get update && apt-get install -y \
    libgl1 \
    libglib2.0-0 \
    libgomp1 \
    && rm -rf /var/lib/apt/lists/*

# 安装 Python 依赖(OCR 和 Flask Web 服务)
RUN pip install --no-cache-dir \
    paddleocr \
    flask \
    paddlepaddle -f https://paddlepaddle.org.cn/whl/cpu.html

# ✅ 可选:提前拉模型用于缓存,也可删除这行以加快构建速度
RUN python -c "from paddleocr import PaddleOCR; PaddleOCR(use_angle_cls=False, lang='en')"

# 拷贝应用
COPY app.py /app.py

# 启动 Flask 服务
CMD ["python", "/app.py"]

EOF

#生成app.py(示例用于提取英语单词)

复制代码
sudo cat > /app/paddle/app.py <<EOF
from flask import Flask, request, jsonify
import requests, io, re
import numpy as np
from PIL import Image
import threading
from concurrent.futures import ThreadPoolExecutor
from paddleocr import PaddleOCR

app = Flask(__name__)
executor = ThreadPoolExecutor(max_workers=2)
thread_local = threading.local()

def get_ocr():
    if not hasattr(thread_local, "ocr"):
        thread_local.ocr = PaddleOCR(
            use_textline_orientation=False,
            lang='en'
        )
    return thread_local.ocr

def process_image(bytes_data):
    try:
        img = Image.open(io.BytesIO(bytes_data)).convert("RGB")
        img_np = np.array(img)
        ocr = get_ocr()
        result = ocr.ocr(img_np)
        texts = result[0].get('rec_texts', [])
        words = [m.group(1) for t in texts if (m := re.match(r'^[0-9]*([A-Za-z]+)$', t))]
        return {"words": words}
    except Exception as e:
        return {"error": str(e)}

@app.route('/ocr', methods=['POST'])
def ocr_route():
    data = request.get_json()
    if not data or 'image_url' not in data:
        return jsonify({"error": "Missing 'image_url'"}), 400
    try:
        resp = requests.get(data['image_url']); resp.raise_for_status()
    except Exception as e:
        return jsonify({"error": f"Failed download image: {e}"}), 400

    future = executor.submit(process_image, resp.content)
    result = future.result()
    if "error" in result:
        return jsonify({"error": "OCR failed: " + result["error"]}), 500
    return jsonify(result)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8866)

EOF

#创建docker镜像

复制代码
cd /app/paddle

docker build -t paddleocr-flask-en .

#启动docker容器

复制代码
docker run -p 8866:8866 -d -v /app/paddle/paddle_data:/root/.paddlex --rm --name paddleocr paddleocr-flask-en

#请求示例

复制代码
curl -X POST http://your.domain:8866/ocr -H "Content-Type: application/json" -d '{"image_url": "http://your.image.domain/demo.jpg"}'
相关推荐
深圳恒讯1 分钟前
香港云主机硬盘满了怎么办?Linux和Windows在线扩容操作教程
linux·运维·windows
饭后一颗花生米4 分钟前
GitHub Actions 自动化:5 个真实运维提效案例
运维·自动化·github
Android系统攻城狮9 分钟前
Linux FFmpeg深度解析之av_parser_init调用流程与实战(二十一)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
Canmag 兴隆磁性30 分钟前
钕铁硼磁片取向方向检测自动化方案:从人工目检到流水线在线分选的工程实践
运维·数据库·自动化·工业自动化·钕铁硼·自动化检测·磁材料
月夏32 分钟前
一个汉字存成了 6 个字节:我用 HEX 揪出 MySQL 双重编码
mysql·docker·全栈
寺中人41 分钟前
CentOS 7进程与任务管理
linux·运维·centos·服务器搭建与管理·linux运维命令·nohup screen
wtblszn1 小时前
凹版印刷机智慧运维物联网系统方案
java·运维·物联网
Yula99331 小时前
把“凌晨电话”消灭在邮件系统架构设计阶段——从运维痛点反推企业邮件系统的工程选择
运维·exchange·数据库管理员·企业邮箱管理员·企业电子邮件系统·企业通讯安全
jiecy2 小时前
在 ARM 的 UOS 系统里布署 WebDav
arm开发·docker·debian
女神下凡3 小时前
芯参谋(87):Linux 系统(SPI NOR)驱动开发指南
linux·运维·arm开发·驱动开发·嵌入式硬件·设计规范