Docker NLTK 下载

48

我正在使用下面的Dockerfile构建一个docker容器:

FROM ubuntu:14.04

RUN apt-get update

RUN apt-get install -y python python-dev python-pip

ADD . /app

RUN apt-get install -y python-scipy

RUN pip install -r /arrc/requirements.txt

EXPOSE 5000

WORKDIR /app

CMD python app.py

一切都很顺利,直到我运行图像并遇到以下错误:

**********************************************************************
  Resource u'tokenizers/punkt/english.pickle' not found.  Please
  use the NLTK Downloader to obtain the resource:  >>>
  nltk.download()
  Searched in:
    - '/root/nltk_data'
    - '/usr/share/nltk_data'
    - '/usr/local/share/nltk_data'
    - '/usr/lib/nltk_data'
    - '/usr/local/lib/nltk_data'
    - u''
**********************************************************************

我之前遇到过这个问题,并且在这里有讨论,但是我不确定该如何使用Docker来解决它。 我已经尝试过:

CMD python
CMD import nltk
CMD nltk.download()

以及:

CMD python -m nltk.downloader -d /usr/share/nltk_data popular

但我仍然收到这个错误。


1
这个命令是错误的:“CMD python CMD import nltk CMD nltk.download()”,它与打开终端,输入“python”,再打开另一个终端,输入“import nltk”等价(当然第二个命令会失败,因为它不在Python中)。 - user2915097
2
可能是类似于 RUN python -c 'import nltk ; nltk.download()' 这样的语法(我不确定具体的语法)。 - user2915097
5个回答

59
在您的Dockerfile中,尝试改为添加以下内容:

RUN python -m nltk.downloader punkt

这将运行该命令并安装所请求的文件到//nltk_data/
问题很可能与在Dockerfile中使用CMD vs. RUN有关。关于CMD的文档如下:

CMD的主要目的是为执行容器提供默认值。

它在docker run <image>期间使用,而不是在构建期间使用。因此,其他CMD行可能被最后一个CMD python app.py行覆盖。

你知道如果我只复制nltk_data文件夹,我需要同时复制未压缩的文件夹和zip文件,还是只需要复制zip文件? - perrohunter
4
我正在使用这种方法,但是出现了以下错误: /usr/local/lib/python3.6/runpy.py:125: RuntimeWarning: 'nltk.downloader'被发现在导入'nltk'包之后,但在执行'nltk.downloader'之前;这可能会导致不可预测的行为。 - xzegga
这里有更多来自NLTK的信息,可用于与上面的命令配对使用。https://www.nltk.org/data.html#command-line-installation - Chris Farr
3
在构建Docker容器时,我也收到了警告,所以我改用以下命令:RUN python -c "import nltk; nltk.download('punkt')"这个命令没有警告并成功构建。 - Johann

12

我尝试了所有建议的方法,但都没有起作用,所以我意识到nltk模块在/root/nltk_data中搜索。

步骤1:我使用以下方式在我的计算机上下载了 punkt:

python3
>>import nltk
>>nltk.download('punkt')

那么 punkt 文件在 /root/nltk_data/tokenizer 中。

步骤 2:我将 tokenizer 文件夹复制到我的目录中,然后我的目录看起来像这样。

.
|-app/
|-tokenizers/
|--punkt/
|---all those pkl files
|--punkt.zip

第三步:我修改了Dockerfile,将其复制到我的Docker实例中

COPY ./tokenizers /root/nltk_data/tokenizers

步骤4:新实例有punkt


1
这篇文章值得更多的点赞。它是解决问题最简单的方法,也是唯一适用于我的方法。我的 Docker:COPY ./nltk_data /usr/local/nltk_data - GDB

3
我在使用Ubuntu镜像和Python3为Django应用创建Docker镜像时遇到了同样的问题。以下是我解决该问题的方法。
# start from an official image
FROM ubuntu:16.04

RUN apt-get update \
  && apt-get install -y python3-pip python3-dev \
  && apt-get install -y libmysqlclient-dev python3-virtualenv

# arbitrary location choice: you can change the directory
RUN mkdir -p /opt/services/djangoapp/src
WORKDIR /opt/services/djangoapp/src

# copy our project code
COPY . /opt/services/djangoapp/src

# install dependency for running service
RUN pip3 install -r requirements.txt
RUN python3 -m nltk.downloader punkt
RUN python3 -m nltk.downloader wordnet

# Setup supervisord
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# Start processes
CMD ["/usr/bin/supervisord"]

2

我通过在容器内指定下载位置,让它在 Google Cloud Build 上工作。

RUN [ "python3", "-c", "import nltk; nltk.download('punkt', download_dir='/usr/local/nltk_data')" ]

完整的 Dockerfile

FROM python:3.8.3

WORKDIR /app

ADD . /app

# install requirements
RUN pip3 install --upgrade pip
RUN pip3 install --no-cache-dir --compile -r requirements.txt

RUN [ "python3", "-c", "import nltk; nltk.download('punkt', download_dir='/usr/local/nltk_data')" ]

CMD exec uvicorn --host 0.0.0.0 --port $PORT main:app

只是好奇... RUN命令中的“-c”部分是什么意思? - RavelRavencroft
1
命令 - 它可以在行内运行Python代码,这些代码通常是您会在文件中编写并使用“python file_name.py”执行的代码。 - E G

0

目前我必须这样做:查看 RUN cp -r /root/nltk_data /usr/local/share/nltk_data

FROM ubuntu:latest
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get clean && apt-get update && apt-get install -y locales
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

RUN apt-get -y update && apt-get install -y --no-install-recommends \
    sudo \
    python3 \
    build-essential \
    python3-pip \
    python3-setuptools \
    python3-dev \
    && rm -rf /var/lib/apt/lists/*
 
RUN pip3 install --upgrade pip

ENV PYTHONPATH "${PYTHONPATH}:/app"

ADD requirements.txt .
# in requirements.txt: pandas, numpy, wordcloud, matplotlib, nltk, sklearn

RUN pip3 install -r requirements.txt 
RUN [ "python3", "-c", "import nltk; nltk.download('stopwords')" ]
RUN [ "python3", "-c", "import nltk; nltk.download('punkt')" ]
RUN cp -r /root/nltk_data /usr/local/share/nltk_data 

RUN addgroup --system app \
    && adduser --system --ingroup app app

WORKDIR /home/app
ADD inputfile .
ADD script.py . 
# the script uses the python modules: pandas, numpy, wordcloud, matplotlib, nltk, sklearn

RUN chown app:app -R /home/app
USER app
RUN python3 script.py inputfile outputfile

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