dockerで動く mecab + python3 の環境を作る

世間ですなる機械学習をといふものを、我もしてみむとてすることにしたなり。

機械学習といえば画像の解析とかの例が多くあるも、CUIに慣れ親しんでいるせいなるか画像系はいまいちテンションがあがらずして、文章系から手をつけてみることにしたなり。

 - 機械学習といえばやっぱPythonだよね
 - 機械学習の文章関連はmecab使って色々やってるひとが多いみたい。mecab前からさわってみたかったしちょうどいいな
 - 個別のPCの環境管理するの最近すっかり面倒くさいから、もちろんdocker上でやろう

というそれはそれは軽い気持ちで環境作り始めたらえらいこと苦労したので、同じ苦労をする人がいないよう書き記すなり。

大変でした…


# これがmecab + pythonが動いた環境です

```txt:ファイル構成
.
├── docker-compose.yml
└── app
    ├── Dockerfile
    └── requirements.txt
```

```docker:docker-compose.yml
version: '3'
services:
  app:
    build: ./app
    volumes:
      - ./app:/app
    working_dir: /app
    tty: true
```

```dockerfile:app/Dockerfile

FROM ubuntu:18.10

# basic libs
RUN apt-get update -y && apt-get upgrade -y
RUN apt-get install -y wget build-essential gcc zlib1g-dev

# latest openssl for python
WORKDIR /root/
RUN wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz \
        && tar zxf openssl-1.1.1d.tar.gz \
        && cd openssl-1.1.1d \
        && ./config \
        && make \
        && make install

# python
WORKDIR /root/
RUN wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz \
        && tar zxf Python-3.6.8.tgz \
        && cd Python-3.6.8 \
        && ./configure \
        && make altinstall
ENV PYTHONIOENCODING "utf-8"

WORKDIR /usr/local/bin/
RUN ln -s python3.6 python
RUN ln -s pip3.6 pip

# mecab
RUN apt-get install -y mecab libmecab-dev mecab-ipadic mecab-ipadic-utf8

# python app settings
ADD requirements.txt ./requirements.txt
RUN pip install -r requirements.txt

WORKDIR /
```

```txt:app/requirements.txt
mecab-python3==0.996.2
```

# 苦労したところ

思い出せる限り時系列順に書きます。軽い気持ちではじめたためエラーログなどは残さなかったのですがご参考まで。

1. Docker Hubで公式から提供されてるpythonのimage使ってそこにmecab入れればええんやろという軽い気持ちではじめる。→**しかし公式から提供されてる環境のOS（たしかDebianだった気がする）の依存管理ツールで、mecabのライブラリが提供されていなかった**
2. mecabが提供されていてかつDockerで使えるUNIX系のOS、という条件で調べた結果、Ubuntuが候補にあがる。探した情報での成功例をもとにUbuntu16.x系でPython環境を作ろうとする。→ しかし**mecabを入れる以前のライブラリのインストールでエラーが起こる**
3. エラーの原因を調べた結果、当該エラーはUbuntu16系で起こるもので、最新のライブラリを参照にいってエラーが起こっているので**古いライブラリを参照するよう手動で設定変更しないといけない**的な話だった→ 調べた通りにやったら確かに直ったのだが**「なんだこれ…」という気持ちになってしまったので、最新のUbuntu18系を使うことにする**
4. Ubuntu18系にしたらライブラリのインストールはうまくいくようになった。Pythonのビルドもうまくいったのだが、次は**pipでなんかエラーが起こる。**→opensslはデフォルトで入っていたのだが**Pythonのビルドの前に、最新のopensslをビルドしていれなおす必要があるとのことだった。** ちなみにapt-getでのupgradeからではダメだった。
5. しかし**前項の問題を修正してもpipでさらに別のエラーが起こる。**このエラーは、**mecab-python3のインストールの時には起こるが、他のライブラリ、例えばpymysqlのインストールの時には起こらなかった**→調べた結果、どうやら**mecab-python3のsetup.pyでPython3.7以降では消えたライブラリを参照しているようだった。**それまで最新のPython3.8で構築を進めていたが、バージョンを3.6に落とすことで解決

# 補足＋余談

 - なお、ホストOSがMacOSのdocker上で動いていることは確認できていますがWindowsやその他はわかりません。
 - 厳密に言えばPythonのバージョンは3.8のままでもライブラリを追加することで対応できなくはなさそうだったのですが、ホストOS（今回の場合MacOS High Sierraでした）に依存していそうなエラーまで出てきて、あれこれもしかしてそろそろ新しいPC買ったほうがいい？　となるに及び「あ、これもう無理だな」ってなりました。
 - CentOSでもmecabが使えるような情報はあったんですけど、なんとなく、こう、最近はとにかくAlpineLinuxかDebianかUbuntuがイケてるみたいな開発界隈の空気があるような…ないような…あるような…（弱腰）


# 謝辞

どうにか成功するまでに、色々なサイトを参考にさせていただきました。ありがとうございます。
しつこいようですがもともと軽い気持ちで始めすぎて、記事化する予定がなかったため、参照元の記録を残していなくてリンクが貼れずすみません。
紆余曲折を経すぎて、最終的に何を参考にしたのかなにが正しかったのかもわからない状態です…。
上記のDockerfileにどこかで見たようなコードがあったら、多分それそこのコピペです。すみません。Thank you!

なお、コピペしたまま必要性の検証はしていないところが多少残っていたり、必須ではないながら自分の好みで入れている処理もあるので、ツッコミどころがありましたら教えていただけますと嬉しいです。