You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让tiangolo-uwsgi-flask-nginx-docker容器调用Tesseract 4容器?

解决方案:让Flask项目容器调用Tesseract服务的几种实用方式

方案1:直接在项目容器内安装Tesseract(最简单直接)

如果不想维护两个独立容器,最省心的办法就是修改你的Flask项目Dockerfile,直接在容器里装上Tesseract。这样你原来的subprocess调用逻辑完全不用改,和本地运行环境保持一致。

比如,基于tiangolo的镜像(Debian/Ubuntu基础),在Dockerfile里添加以下安装命令:

# 安装Tesseract核心包+中文语言包(按需添加其他语言)
RUN apt-get update && apt-get install -y --no-install-recommends \
    tesseract-ocr \
    tesseract-ocr-chi-sim \
    && rm -rf /var/lib/apt/lists/*

重新构建项目镜像并启动容器后,原来的本地调用逻辑就能正常工作,完全不用调整代码。

方案2:通过Docker网络联动两个容器,用HTTP请求调用Tesseract服务

如果你坚持要分开维护项目容器和Tesseract容器,可以把它们放到同一个Docker网络里,通过HTTP请求调用Tesseract容器提供的REST服务——你用的tesseractshadow/tesseract4re镜像默认就自带了端口5000的HTTP服务,刚好能用上。

步骤1:创建共享网络并启动容器

先创建一个自定义Docker网络,让两个容器能互相识别:

docker network create tesseract-shared-net

启动Tesseract容器并加入这个网络:

docker run -d --name tesseract-service --network tesseract-shared-net tesseractshadow/tesseract4re:latest

再启动你的Flask项目容器,同样加入这个网络:

docker run -d --name flask-app --network tesseract-shared-net -p 80:80 你的项目镜像名:latest

步骤2:修改Python代码,替换subprocess为HTTP请求

原来的本地调用逻辑大概是这样:

import subprocess

def ocr_image(image_path):
    result = subprocess.run(
        ['tesseract', image_path, 'stdout'],
        capture_output=True,
        text=True
    )
    return result.stdout

现在改成调用Tesseract容器的HTTP服务:

import requests

def ocr_image(image_path):
    # 同一个网络里直接用容器名+端口访问
    tesseract_url = "http://tesseract-service:5000/ocr"
    with open(image_path, 'rb') as img_file:
        # 上传图片文件,可指定识别语言(比如中文chi_sim)
        response = requests.post(
            tesseract_url,
            files={'file': img_file},
            params={'lang': 'chi_sim'}
        )
        response.raise_for_status()  # 捕获请求异常
        return response.json()['text']

这样项目容器里完全不用装Tesseract,直接通过网络调用服务即可。

方案3:用Docker Compose编排容器(生产环境推荐)

如果需要长期维护这套服务,用Docker Compose来统一管理两个容器会更高效,不用手动创建网络和逐个启动容器。

创建docker-compose.yml文件:

version: '3.8'
services:
  flask-app:
    build: ./你的Flask项目目录  # 指向包含Dockerfile的项目路径
    ports:
      - "80:80"
    networks:
      - tesseract-net
    depends_on:
      - tesseract-service  # 确保Tesseract服务先启动

  tesseract-service:
    image: tesseractshadow/tesseract4re:latest
    networks:
      - tesseract-net

networks:
  tesseract-net:
    driver: bridge

运行docker-compose up -d,两个容器会自动启动在同一个网络里,Flask项目直接用tesseract-service作为主机名就能访问Tesseract服务。

补充:为什么不能直接用AWS实例上的Tesseract?

Docker容器本身是隔离环境,默认无法直接访问宿主机的程序——除非你把宿主机的/usr/bin/tesseract挂载到容器里,但这种方式会有兼容性风险(比如依赖库版本不匹配),不推荐在生产环境使用。


内容的提问来源于stack exchange,提问作者Chuck Aguilar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:31:30