Docker容器中离线运行tika-python失败问题求助
问题背景
我有一个基于tika-python的Web应用,在线运行时每次启动都会自动下载tika-server.jar,偶尔会因为下载失败导致服务彻底无法启动。我已经把需要的jar文件下载到本地./temp目录,想通过Docker配置实现离线运行,避免重复下载,但现在配置完后没法正常工作,求解决办法。
现有配置文件
Dockerfile代码
FROM python:3.8-slim WORKDIR /app COPY ./templates /app/templates COPY ./temp /app/temp COPY ./app.py /app/app.py COPY ./requirements.txt /app/requirements.txt RUN pip install --no-deps --no-cache-dir -r requirements.txt && \ apt-get update && \ DEBIAN_FRONTEND=noninteractive \ apt-get -y install default-jre-headless && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* #ENV ENV TIKA_SERVER_JAR = ./temp/tika-server.jar ENV TIKA_PATH = ./temp #PORT EXPOSE 5000 # configure the container to run in an executed manner ENTRYPOINT [ "python", "app.py" ]
app.py代码
import os from tika import parser os.environ['TIKA_SERVER_JAR'] = './temp/tika-server.jar' os.environ['TIKA_PATH'] = './temp' text = parser.from_file(file, service='text')['content']
当前环境变量
{'GPG_KEY': 'E3FF2839C048B25C084DEBE9B2*************68', 'HOME': '/root', 'HOSTNAME': '2d43d*****', 'LANG': 'C.UTF-8', 'PATH': '/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 'PYTHON_GET_PIP_SHA256': '5aefe6ade911d997af080b315ebcb7f882212d070465df544e1175ac2be519b4', 'PYTHON_GET_PIP_URL': 'https://github.com/pypa/get-pip/raw/5eaac1050023df1f5c98b173b248c260023f2278/public/get-pip.py', 'PYTHON_PIP_VERSION': '22.0.4', 'PYTHON_SETUPTOOLS_VERSION': '57.5.0', 'PYTHON_VERSION': '3.8.13', 'TIKA_PATH': './my_project', 'TIKA_SERVER_JAR': './my_project/tika-server.jar'}
解决方案
1. 修正Dockerfile的环境变量设置
Docker的ENV指令中等号两边不能有空格,且使用绝对路径更可靠,避免工作目录变化导致路径失效。修改后的ENV部分:
ENV TIKA_SERVER_JAR /app/temp/tika-server.jar ENV TIKA_PATH /app/temp
2. 移除app.py中硬编码的环境变量
代码里的os.environ赋值会覆盖容器的环境变量,且相对路径可能引发问题。修改后的app.py:
import os from tika import parser # 直接读取容器配置的环境变量,不再硬编码 text = parser.from_file(file, service='text')['content']
3. 验证jar文件路径
确保本地./temp目录下确实存在tika-server.jar,且Docker的COPY ./temp /app/temp指令已正确将文件复制到容器内的/app/temp路径。
4. 重新构建并运行容器
执行以下命令重新构建镜像并启动容器:
docker build -t tika-app . docker run -p 5000:5000 tika-app
配置完成后,tika-python会直接使用容器内预存的tika-server.jar,不会再尝试在线下载,实现离线运行。
内容的提问来源于stack exchange,提问作者Garuda
相关产品推荐
相关产品推荐

