Cloud RunでnltkライブラリがインストールされたDockerコンテナをデプロイしようとしてハマったのでメモ。
事象
以下のように、Dockerfile
にnltk
ライブラリをインストールするよう記述し、Cloud RunでDockerコンテナをデプロイしようとするとエラーが発生します。
RUN pip install nltk
RUN nltk.download('punkt')
2019-12-23 14:02:28.321 PDT Resource [93mpunkt[0m not found.
2019-12-23 14:02:28.321 PDT Please use the NLTK Downloader to obtain the resource:
2019-12-23 14:02:28.321 PDT
2019-12-23 14:02:28.321 PDT [31m>>> import nltk
2019-12-23 14:02:28.321 PDT >>> nltk.download('punkt')
2019-12-23 14:02:28.321 PDT [0m
2019-12-23 14:02:28.321 PDT For more information see: https://www.nltk.org/data.html
2019-12-23 14:02:28.321 PDT
2019-12-23 14:02:28.321 PDT Attempted to load [93mtokenizers/punkt/PY3/english.pickle[0m
2019-12-23 14:02:28.321 PDT
2019-12-23 14:02:28.321 PDT Searched in:
2019-12-23 14:02:28.321 PDT - '/home/nltk_data'
2019-12-23 14:02:28.321 PDT - '/usr/local/nltk_data'
2019-12-23 14:02:28.321 PDT - '/usr/local/share/nltk_data'
2019-12-23 14:02:28.321 PDT - '/usr/local/lib/nltk_data'
2019-12-23 14:02:28.321 PDT - '/usr/share/nltk_data'
2019-12-23 14:02:28.321 PDT - '/usr/local/share/nltk_data'
2019-12-23 14:02:28.321 PDT - '/usr/lib/nltk_data'
2019-12-23 14:02:28.321 PDT - '/usr/local/lib/nltk_data'
2019-12-23 14:02:28.321 PDT - ''
errorメッセージを読むと、「nltk
ライブラリのダウンロード先を探してみたけど見つからない!」と言っているようです。
Dockerfile
でnltk
ライブラリをインストールしているにも関わらず不思議なエラーです。
原因
以下でヒントが述べられています。
https://stackoverflow.com/questions/58654672/after-adding-nltk-downloadwords-google-cloud-run
どうやら、nltk
のインストール方法には以下の3つが存在していて、App EngineやCloud Runで動作させるためには、Manual installationが必要とのこと。
- Interactive installer
- Command line installation
- Manual installation
nltk.download()
はInteractive installer(GUIを使う)なのでApp EngineやCloud Runで動作しなかったようです。
解決策
Dockerfileに以下を追記することでnltkライブラリを使えるようになりました。
# for install wget
RUN apt-get update && apt-get install -y wget
# for NLTK manual download
WORKDIR /usr/local/nltk_data/tokenizers
RUN wget "https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/packages/tokenizers/punkt.zip" -O punkt.zip
RUN unzip punkt.zip