如何让tiangolo-uwsgi-flask-nginx-docker容器调用Tesseract 4容器?
方案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

