Docker Python Tika

3

我希望创建一个 Dockerfile,在 Docker 容器内安装运行 Python-tika 所需的所有组件。

目前,这是我的 Dockerfile:

###Get python
FROM python:3

RUN pip3 install --upgrade pip requests
RUN pip3 install python-docx tika numpy pandas

RUN mkdir scripts

ADD runner.py /scripts/

CMD [ "python", "./scripts/runner.py" ]

我构建并运行Dockerfile:

docker build -t docker-tika .

docker run docker-tika

但它报告了以下错误:

[~/Documents/BERT_DV/Docker_Parser] $ docker run docker-tika
2020-05-08 13:49:52,528 [MainThread  ] [INFO ]  Retrieving http://search.maven.org/remotecontent?filepath=org/apache/tika/tika-server/1.24/tika-server-1.24.jar to /tmp/tika-server.jar.
2020-05-08 13:50:09,742 [MainThread  ] [INFO ]  Retrieving http://search.maven.org/remotecontent?filepath=org/apache/tika/tika-server/1.24/tika-server-1.24.jar.md5 to /tmp/tika-server.jar.md5.
2020-05-08 13:50:10,133 [MainThread  ] [ERROR]  Unable to run java; is it installed?
2020-05-08 13:50:10,134 [MainThread  ] [ERROR]  Failed to receive startup confirmation from startServer.
2020-05-08 13:50:10,271 [MainThread  ] [ERROR]  Unable to run java; is it installed?
2020-05-08 13:50:10,271 [MainThread  ] [ERROR]  Failed to receive startup confirmation from startServer.

runner.py脚本如下:

import tika
tika.initVM()

我有以下两个问题: 1. 我看到需要下载tika-server jar 2. 在Python脚本中调用initVM()以在后台启动tika-server

我不知道Dockerfile缺少什么。感谢帮助!

我已经更新了Dockerfile并添加了Java,但它仍然提示缺少Java。

### 1. Get Linux
FROM alpine:3.7

### 2. Get Java via the package manager
RUN apk update \
&& apk upgrade \
&& apk add --no-cache bash \
&& apk add --no-cache --virtual=build-dependencies unzip \
&& apk add --no-cache curl \
&& apk add --no-cache openjdk8-jre

ENV JAVA_HOME=/opt/java/openjdk \
    PATH="/opt/java/openjdk/bin:$PATH"

###3. Get ython
FROM python:3

RUN pip3 install --upgrade pip requests
RUN pip3 install python-docx tika numpy pandas

RUN mkdir scripts
RUN mkdir pdfs
RUN mkdir output

ADD runner2.py /scripts/
ADD sample.pdf .

CMD [ "python", "./scripts/runner2.py" ]

猫 runner2.py:

#!/usr/bin/env python
import tika
from tika import parser
parsed = parser.from_file('sample.pdf')
print(parsed["metadata"])
print(parsed["content"])

[~/Documents/BERT_DV/Docker_Parser] $ docker run docker-tika

在Docker中运行docker-tika。
2020-05-08 14:40:23,183 [MainThread  ] [INFO ]  Retrieving http://search.maven.org/remotecontent?filepath=org/apache/tika/tika-server/1.24/tika-server-1.24.jar to /tmp/tika-server.jar.
2020-05-08 14:41:00,480 [MainThread  ] [INFO ]  Retrieving http://search.maven.org/remotecontent?filepath=org/apache/tika/tika-server/1.24/tika-server-1.24.jar.md5 to /tmp/tika-server.jar.md5.
2020-05-08 14:41:02,324 [MainThread  ] [ERROR]  Unable to run java; is it installed?
2020-05-08 14:41:02,324 [MainThread  ] [ERROR]  Failed to receive startup confirmation from startServer.

Tika是一个Java应用程序,因此您的图像需要安装JVM。最好在单独的容器中运行Tika服务器,然后通过适当的环境变量将Python“tika”模块指向它。似乎有来自Tika团队的apache/tika映像。 - larsks
3个回答

4

我没有足够的声望来评论,所以在这里发布。

看起来你的Dockerfile现在正在进行多阶段构建,Java不再是最后一个阶段 - 先前的阶段被删除了。

正如Giga Kokaia之前和其他人所说的那样,Java是问题所在。看起来你想用单个Dockerfile完成它。例如,可以将Alpine作为基础镜像,但你需要一些额外的依赖项才能安装Python和所需的pip包。当与许多库一起使用时,Alpine可能不是Python的最佳基础,因为它没有使用libc库。然而,下面是非常粗略的Dockerfile更新:

### 1. Get Linux
FROM alpine:3.7

### 2. Get Java via the package manager
RUN apk update \
&& apk upgrade \
&& apk add --no-cache bash \
&& apk add --no-cache --virtual=build-dependencies unzip \
&& apk add --no-cache curl \
&& apk add --no-cache openjdk8-jre \
&& apk add python3 python3-dev gcc g++ gfortran musl-dev libxml2-dev libxslt-dev

ENV JAVA_HOME=/opt/java/openjdk \
    PATH="/opt/java/openjdk/bin:$PATH"


RUN pip3 install --upgrade pip requests
RUN pip3 install python-docx wheel tika numpy 
RUN pip3 install pandas

RUN mkdir scripts
RUN mkdir pdfs
RUN mkdir output

ADD runner2.py /scripts/
ADD sample.pdf .

CMD [ "python3", "./scripts/runner2.py"  ]

谢谢你,Niklas,发现了多阶段构建问题。感谢。 - Space X

1

从tika-s的github页面:

要使用这个库,您需要在系统上安装Java 7+,因为tika-python会在后台启动Tika REST服务器。

所以您需要安装Java,但是python:3镜像中没有Java。有一些解决方案:

  1. 查找已安装Python和Tika的Docker镜像
  2. 使用单独的镜像
  3. 在Python:3中手动安装Java,在您的Dockerfile中添加Java安装命令
  4. 在Java镜像上安装Python

我已经更新了Dockerfile,但仍然收到相同的错误: - Space X
你如何更新Dockerfile?你能改变问题吗? - Giga Kokaia
是的,我刚刚使用更新后的Dockerfile更新了问题。谢谢! - Space X
1
我通过将Tika作为单独的服务来解决了这个问题(与将其放在同一映像中相比,它具有更好的性能)。但是,我没有运行Tika的jar文件,而是使用了它的API。您只需要配置环境变量TIKA_CLIENT_ONLY:1和TIKA_SERVER_ENDPOINT:http://tika:9998。您可以在此处查看Dockerfile和docker-compose.yml:https://github.com/DadosAbertosDeFeira/maria-quiteria/ - anapaulagomes

0

我将@anapaulagomes的评论转发为答案,因为这正是我在谷歌上搜索的——将Tika作为Docker容器运行:

我成功地通过使用Tika作为单独的服务来解决了这个问题(它比将其放在同一映像中具有更好的性能)。但是,我没有运行Tika的jar文件,而是使用了它的API。您只需要配置环境变量TIKA_CLIENT_ONLY: 1TIKA_SERVER_ENDPOINT: tika:9998。您可以在此处查看Dockerfile和docker-compose.yml: https://github.com/DadosAbertosDeFeira/maria-quiteria

您可以使用以下命令启动Tika服务:

docker run --rm -t -d --name my_tika --net my-network \
         -p 9998:9998 apache/tika:1.27

或者通过将以下内容添加到您的docker-compose.yml文件中:

tika:
    image: apache/tika
    ports:
        - "9998:9998"

这可以让您调用from tika import parser并解析,而无需调用tika.initVM()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接