docker からjupiter notebookとOpenCVを使いたい

docker

最近OpenCVを使って遊びたいので、dockerを使いつつやっていきたい。ついでにdocker fileも書きたい。。

というわけでいちからやってみることにしました。

調べてみる

すぐにでてきてしまった。。
docker + jupyter で画像処理用コンテナ

ただ今回はちゃんと自分でdocker fileを書きたいのである。というわけで参考にはしつつ、ちゃんとドキュメント見ながらやってみます。

環境

  • MacBook Pro 10.14.3
  • docker version 18.09.1

docker hub

qiitaの記事通り、まずはdockerのベースイメージを決める。
https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html#jupyter-base-notebook

他にもあるみたいだけど、何が必要かわからないのでとりあえずbaseでいくことにしました。必要になったら切り替えればいいかなーと。

というわけでまずは以下のように記述。ほぼ転載だけどまじめにやってるつもり。。

FROM jupyter/base-notebook

とりあえずbuildしてみる

中入ってからコマンド確かめてbuildを繰り返してくのが早いらしいのでそれにならっていきます。

docker build -t py-opencv .

1分かからず終了。

Runしてみる

-e GRANT_SUDO=yes --user rootをいれなくて一回詰まりました。sudoするにもパスワードがわからなかったためです。

docker run -it -e GRANT_SUDO=yes --user root --rm -p 8888:8888 py-opencv
Executing the command: jupyter notebook
[I 12:34:25.715 NotebookApp] Writing notebook server cookie secret to /home/jovyan/.local/share/jupyter/runtime/notebook_cookie_secret
[I 12:34:26.657 NotebookApp] JupyterLab extension loaded from /opt/conda/lib/python3.7/site-packages/jupyterlab
[I 12:34:26.657 NotebookApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
[I 12:34:26.659 NotebookApp] Serving notebooks from local directory: /home/jovyan
[I 12:34:26.659 NotebookApp] The Jupyter Notebook is running at:
[I 12:34:26.659 NotebookApp] http://(9e0e0b14f3d9 or 127.0.0.1):8888/?token=a5a44f85cfce789db16beb10fbe39f67b29320bfde5ae382
[I 12:34:26.660 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 12:34:26.663 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///home/jovyan/.local/share/jupyter/runtime/nbserver-6-open.html
    Or copy and paste one of these URLs:
        http://(9e0e0b14f3d or 127.0.0.1):8888/?token=a5a44f85cfce789db16beb10fbe39f67b29320bfde5ae382

というわけでまずはせっかくなので表示してみる。

jupiter

表示されました!というわけで次はOpenCVのインストール。

再度docker側のbashへ

jupiterの起動でbashで入力ができないので、

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
e0e0b14f3d9        py-opencv           "tini -g -- start-no…"   4 minutes ago       Up 4 minutes        0.0.0.0:8888->8888/tcp   tender_mclean

でコンテナIDを調べて

docker exec -it e0e0b14f3d9 bash

bashに入ったら

pip install opencv-python

importしてみるもエラーがでます。

ImportError                               Traceback (most recent call last)
<ipython-input-1-c8ec22b3e787> in <module>
----> 1 import cv2

/opt/conda/lib/python3.7/site-packages/cv2/__init__.py in <module>
      1 import importlib
      2 
----> 3 from .cv2 import *
      4 from .data import *
      5 

ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory

いろいろ試した結果以下のコマンドでエラーがなくなりました。

apt-get install -y libglib2.0-0 libsm6 libxrender1 libxext6
OpenCVをPythonで動かそうとしてlibGL.soが無いって言われたけど解決した。 - Qiita
Docker上でOpenCVのPythonBindingを動かそうとしたらエラーがでた。import cv2ImportError: libGL.so.1: cannot open shared…

バージョンは4.0.1です。

jupiter-OpenCV

docker fileを更新

うまく行きそうなコマンドが見つかったのでdocker fileに書いてみます。

公式のドキュメントみるとこれもまたqiitaの記事通り、userがjovyanになってるので。。

Unprivileged user jovyan (uid=1000, configurable, see options) in group users (gid=100) with ownership over the /home/jovyan and /opt/conda paths

FROM jupyter/base-notebook

USER root

RUN apt-get update && \
    apt-get install -y \
    libglib2.0-0 \
    libsm6 \
    libxrender1 \
    libxext6 && \
    pip install opencv-python matplotlib

そしてbuild

The directory '/home/jovyan/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.

エラーが出ましたがimportは正常にできました。ただ気持ち悪いのでちゃんとUserを変えてあげるように修正します。

jupiter-OpenCV

FROM jupyter/base-notebook

USER root

RUN apt-get update && \
    apt-get install -y \
    libglib2.0-0 \
    libsm6 \
    libxrender1 \
    libxext6

USER jovyan

RUN pip install opencv-python \
matplotlib

とりあえずこれで動きそうです。最後にディレクトリをマウントして、画像が読み込まれるかどうかをやってみます。

docker run -it -v $PWD:/home/jovyan/work -e GRANT_SUDO=yes --user root --rm -p 8888:8888 py-opencv2

できた!色の順番のせいで溺れてる感あるけど。。

jupiter-OpenCV

まとめ

ひとまず頑張ってカンニングしながらつくった環境で勉強していきたいと思います。

コメント