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"}'

### 使用 Docker 打包 PaddleOCR 环境 为了创建一个包含 PaddleOCRDocker 镜像,首先需要编写一个合适的 `Dockerfile` 文件来定义环境配置。以下是详细的说明: #### 编写 Dockerfile 在项目根目录下创建名为 `Dockerfile` 的文件,编辑其内容如下所示: ```dockerfile # 基础镜像选择官方 Python 版本作为基础镜像 FROM python:3.9-slim-buster # 设置工作目录 WORKDIR /app # 安装必要的依赖库 RUN apt-get update && \ apt-get install -y --no-install-recommends \ libgl1-mesa-glx \ libglib2.0-0 \ ffmpeg \ opencv-python-headless \ wget \ unzip \ && rm -rf /var/lib/apt/lists/* # 复制当前目录下的所有文件到容器中的/app路径下 COPY . . # 安装Python依赖项 RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \ pip install --upgrade pip && \ pip install -r requirements.txt # 下载安装PaddleOCR及其预训练模型 RUN pip install paddleocr # 暴露服务端口 EXPOSE 8866 # 启动命令 CMD ["python", "your_ocr_script.py"] ``` 此脚本基于精简版的 Debian Buster 和 Python 3.9 来构建一个新的 Docker 映像,在其中设置了适当的工作区、安装了所需的软件包以及指定了启动应用程序的方式。 #### 构建 Docker 镜像 完成上述操作之后,可以通过下面这条指令来进行映像的自动化组装[^1]: ```bash docker build -t paddle-ocr:cpu . ``` 这会读取位于上下文内的 `Dockerfile` 按照指示逐步处理直至最终形成目标标签为 `paddle-ocr:cpu` 的新映像实例;期间可能会下载大量资源,请提前确认有足够的磁盘容量可用,因为整个过程大约会产生超过 6GB 的数据量。 #### 运行 Docker 容器 一旦成功建立了自定义映像,则可通过下列方式激活相应的 OCR 应用程序: ```bash docker run -dp 8866:8866 --name ocr paddle-ocr:cpu ``` 该命令将会以前台守护进程的形式开启新的容器实例,将其内部监听于第 8866 号 TCP 接口服务转发至宿主机相同编号的位置上以便外部访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值