【问题标题】:Docker python tika码头工人蟒蛇提卡
【发布时间】:2020-05-08 14:32:33
【问题描述】:

我喜欢创建一个 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.在后台启动tika-server的python脚本中调用initVM()。

我不知道其中缺少什么。 Docker 文件。感谢帮助!

我也用 Java 更新了 Docker 文件,但它仍然在抱怨 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" ]

猫亚军2.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

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 服务器,然后通过适当的 environment variable 将 Python tika 模块指向它。 Tika 团队似乎有一张apache/tika 的图片。

标签: python docker apache-tika


【解决方案1】:

我没有评论的声誉,所以在这里发帖。

看来,您的 Dockerfile 现在正在制作 multi-stage build,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 发现多阶段构建问题。谢谢
【解决方案2】:

来自 tika-s github:

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

所以你需要有java,但是python:3 图像中没有java。 有一些解决方案

  1. 找到python和tika安装的docker镜像
  2. 使用单独的图片
  3. 在python:3上手动安装java,将java安装命令添加到你的Dockerfile中
  4. 在 java 镜像上安装 python

【讨论】:

  • 我已经更新了 Dockerfile 仍然出现同样的错误:
  • 如何更新 Dockerfile?你能换个问题吗?
  • 是的,我刚刚使用更新的 Dockerfile 更新了问题。谢谢!
  • 我设法通过使用 Tika 作为一个单独的服务来解决这个问题(它比在同一个图像中具有更好的性能)。但我没有运行 Tika 的 jar,而是使用它的 API。您只需要配置环境变量TIKA_CLIENT_ONLY: 1 和TIKA_SERVER_ENDPOINT:tika:9998。您可以在此处查看 Dockerfile 和 docker-compose.yml:github.com/DadosAbertosDeFeira/maria-quiteria
【解决方案3】:

我将@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()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多