一、基于Ubuntu创建基础容器

1.1、拉取Ubuntu基础镜像

docker pull ubuntu:22.04

1.2、创建并进入容器(容器命名为:tesseract)

docker run -it --name tesseract ubuntu:22.04 /bin/bash

1.3、在容器内安装Tesseract相关依赖

1.3.1、更新apt

apt update && apt upgrade -y

1.3.2、安装基础依赖包

apt install -y \
    wget \
    curl \
    gcc \
    g++ \
    make \
    autoconf \
    automake \
    libtool \
    pkg-config \
    libpng-dev \
    libjpeg-dev \
    libtiff-dev \
    zlib1g-dev \
    libwebp-dev \
    libopenjp2-7-dev \
    libleptonica-dev \
    locales \
    apt-utils

1.3.3、配置UTF-8字符编码

# 生成UTF-8 locale
locale-gen en_US.UTF-8 zh_CN.UTF-8

# 设置环境变量
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

# 永久生效(写入bashrc)
echo "export LC_ALL=en_US.UTF-8" >> ~/.bashrc
echo "export LANG=en_US.UTF-8" >> ~/.bashrc
echo "export LANGUAGE=en_US.UTF-8" >> ~/.bashrc

1.4、安装Tesseract OCR

1.4.1、下载Tesseract源码并解压(版本号可调整)

# 下载
wget https://github.com/tesseract-ocr/tesseract/archive/refs/tags/5.3.0.tar.gz -O tesseract-5.3.0.tar.gz

# 解压
tar -zxvf tesseract-5.3.0.tar.gz

1.4.2、编译安装

# 进入Tesseract解压后目录
cd tesseract-5.3.0

# 编译
./autogen.sh

# 指定安装路径
./configure --prefix=/usr/local  

# 多核编译并安装
make -j$(nproc)  
make install

1.4.3、下载语言包(中英文)

mkdir -p /usr/local/share/tessdata

wget https://github.com/tesseract-ocr/tessdata/raw/main/chi_sim.traineddata -O /usr/local/share/tessdata/chi_sim.traineddata
wget https://github.com/tesseract-ocr/tessdata/raw/main/eng.traineddata -O /usr/local/share/tessdata/eng.traineddata

1.4.4、配置环境变量

echo "export PATH=/usr/local/bin:$PATH" >> ~/.bashrc
echo "export TESSDATA_PREFIX=/usr/local/share/tessdata" >> ~/.bashrc

source ~/.bashrc

1.4.5、验证是否安装成功

tesseract --version

1.5、测试OCR识别

# 将宿主机中图片传到容器内部
docker cp test.png tesseract:/root/test.png

# 识别简体中文图片
tesseract /root/test.png output -l chi_sim

# 查看识别结果
cat output.txt

1.6、保存自定义容器为镜像(便于后续复用)

# 退出容器
exit

# 提交容器为新镜像
docker commit tesseract tesseract:v1.0

# 查看镜像是否存在
docker images

1.7、安装时的坑

1.7.1、验证是否安装时报错

root@d302f5df0f87:/tesseract-5.3.0# tesseract --version
tesseract: error while loading shared libraries: libtesseract.so.5: cannot open shared object file: No such file or directory

错误原因:源码编译安装后,系统动态链接库缓存未更新,导致系统找不到 Tesseract 的共享库文件。
解决方法:

1、定位 libtesseract.so.5 的安装路径

# 查找libtesseract.so.5文件
find /usr/local -name "libtesseract.so.5"

# 正常输出示例
/usr/local/lib/libtesseract.so.5

说明:

如果能找到这个文件,说明编译安装成功,只是系统没识别到;
如果找不到,说明编译 / 安装步骤出错,需重新执行 make install

2、 修复动态链接库缓存

  • 将 /usr/local/lib 加入系统库搜索路径;
# 编辑ld.so.conf文件
echo "/usr/local/lib" >> /etc/ld.so.conf
  • 更新动态链接库缓存
# 更新
ldconfig

3、验证解决方法

# 检查Tesseract版本
tesseract --version

二、安装Python环境

2.1、进入现有容器

# 进入容器
docker exec -it tesseract /bin/bash

2.2、安装Python依赖

# 更新apt源
apt update && apt install -y python3 python3-pip

# 安装Python依赖(Flask+Pillow+pytesseract)
pip3 install flask==2.3.3 pillow==10.0.1 pytesseract==0.3.10

2.3、在容器内编写 HTTP 接口脚本

# 创建工作目录(避免文件散落)
mkdir -p /app && cd /app

# 编写ocr_server.py脚本
vi ocr_server.py

脚本内容:

from flask import Flask, request, jsonify
import pytesseract
from PIL import Image
import io

app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
pytesseract.pytesseract.tesseract_cmd = '/usr/local/bin/tesseract'

@app.route('/ocr', methods=['POST'])
def ocr_recognize():
    try:
        if 'file' not in request.files:
            return jsonify({'code':400, 'msg':'未上传图片', 'data':''}), 400
        file = request.files['file']
        if file.filename == '':
            return jsonify({'code':400, 'msg':'文件为空', 'data':''}), 400
        allowed = {'png','jpg','jpeg','bmp'}
        if not file.filename.split('.')[-1].lower() in allowed:
            return jsonify({'code':400, 'msg':'仅支持PNG/JPG/BMP', 'data':''}), 400
        
        image = Image.open(io.BytesIO(file.read()))
        result = pytesseract.image_to_string(image, lang='chi_sim')
        return jsonify({'code':200, 'msg':'识别成功', 'data':result.strip()}), 200
    except Exception as e:
        return jsonify({'code':500, 'msg':f'失败:{str(e)}', 'data':''}), 500

@app.route('/health', methods=['GET'])
def health():
    return jsonify({'code':200, 'msg':'正常', 'data':'ok'}), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=48086, debug=False)

2.4、退出容器,提交新镜像

# 退出容器
exit

# 提交新镜像
docker commit tesseract tesseract-api:v2

# 验证镜像是否存在
docker images

2.5、基于新镜像启动容器

# 启动带Python脚本的容器
docker run -d --name tesseract-api -p 48086:48086 tesseract-api:v2 python3 /app/ocr_server.py

2.6、验证接口功能

# 健康检查
curl http://localhost:48086/health

# 上传图片测试OCR(外部调用可将localhost替换成服务器地址)
curl -X POST -F "file=@test.jpg" http://localhost:48086/ocr

2.7、补充:vim 安装

容器内部可能没有 vi 或 vim文本编辑器,需要手动安装。

# 安装 vim
apt install vim 

更多推荐