最近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
というわけでまずはせっかくなので表示してみる。
表示されました!というわけで次は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
バージョンは4.0.1です。
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を変えてあげるように修正します。
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
できた!色の順番のせいで溺れてる感あるけど。。
まとめ
ひとまず頑張ってカンニングしながらつくった環境で勉強していきたいと思います。
コメント