【Python】DockerでOpenCVをインストールする時の設定

# はじまり

DockerでPython用のコンテナをビルドする時に
OpenCVも一緒にインストールしたら躓いたので、備忘録。

# 最初に躓いたイメージ

まず、このイメージでビルドししてopencvを利用しているプログラムを実行しました。

```Dockerfile
FROM ubuntu:latest

ENV PYTHON_VERSION 3.7.1
ENV HOME /root
ENV PYTHON_ROOT $HOME/local/python-$PYTHON_VERSION
ENV PATH $PYTHON_ROOT/bin:$PATH
ENV PYENV_ROOT $HOME/.pyenv

RUN apt update

RUN apt install -y python3 python3-pip
RUN pip install --upgrade pip

WORKDIR /usr/src/app
COPY ./ /usr/src/app

RUN pip install opencv-python
```

そうしたら、こんなエラーが出現。

```shell-session
# python3 app.py

------------------------------------------------------------------------------------
Traceback (most recent call last):
  File "app.py", line 4, in <module>
    import cv2
  File "/usr/local/lib/python3.8/dist-packages/cv2/__init__.py", line 8, in <module>
    from .cv2 import *
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
------------------------------------------------------------------------------------
```

# 設定その１：モジュール追加その１、そして再度躓く

どうやら、OpenCVの実行に必要なモジュールをaptで取ってくる必要があるらしい。

```Dockerfile
FROM ubuntu:latest

ENV PYTHON_VERSION 3.7.1
ENV HOME /root
ENV PYTHON_ROOT $HOME/local/python-$PYTHON_VERSION
ENV PATH $PYTHON_ROOT/bin:$PATH
ENV PYENV_ROOT $HOME/.pyenv

RUN apt update
# ↓追加↓
RUN apt-get install -y libgl1-mesa-dev

RUN apt install -y python3 python3-pip
RUN pip install --upgrade pip

WORKDIR /usr/src/app
COPY ./ /usr/src/app

RUN pip install opencv-python
```

しかぁし、またもや躓く。

```shell-session
------------------------------------------------------------------------------------
Traceback (most recent call last):
  File "app.py", line 4, in <module>
    import cv2
  File "/usr/local/lib/python3.8/dist-packages/cv2/__init__.py", line 8, in <module>
    from .cv2 import *
ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory
------------------------------------------------------------------------------------
```

# 設定その２：モジュール追加その２、そして再度躓く

どうやら、OpenCVの実行に必要な別のモジュールをaptで取ってくる必要があるらしい。

```Dockerfile
FROM ubuntu:latest

ENV PYTHON_VERSION 3.7.1
ENV HOME /root
ENV PYTHON_ROOT $HOME/local/python-$PYTHON_VERSION
ENV PATH $PYTHON_ROOT/bin:$PATH
ENV PYENV_ROOT $HOME/.pyenv

RUN apt update

# - ↓削除↓
RUN apt-get install -y libgl1-mesa-dev
# + ↓追加↓
RUN apt install -y libopencv-dev

RUN apt install -y python3 python3-pip
RUN pip install --upgrade pip

WORKDIR /usr/src/app
COPY ./ /usr/src/app

RUN pip install opencv-python
```

しかし、ビルドを始めて近くのコンビニに行って帰ってきたら、、、

```shell_session
-----------------------------------------------------------------------------------------------------------
=> [3/8] RUN apt install -y libopencv-dev                                                          833.9s
 => => # questions will narrow this down by presenting a list of cities, representing                                                                                          
 => => # the time zones in which they are located.                                                                                                                             
 => => #   1. Africa      4. Australia  7. Atlantic  10. Pacific  13. Etc                                                                                                      
 => => #   2. America     5. Arctic     8. Europe    11. SystemV                                                                                                               
 => => #   3. Antarctica  6. Asia       9. Indian    12. US                                                                                                                    
 => => # Geographic area:                                                                                                                                                      
-----------------------------------------------------------------------------------------------------------
```

タイムゾーンの選択を愚直に待ち続けていたのでした・・・

# 設定その３：タイムゾーンを設定する

サーバのタイムゾーンを設定していないことで発生する模様。以下で追加して対処。

```Dockerfile
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

そしたら、無事Pythonプログラムが走りました。

# 最終的にビルドできたイメージ

```Dockerfile
FROM ubuntu:latest

ENV PYTHON_VERSION 3.7.1
ENV HOME /root
ENV PYTHON_ROOT $HOME/local/python-$PYTHON_VERSION
ENV PATH $PYTHON_ROOT/bin:$PATH
ENV PYENV_ROOT $HOME/.pyenv

# タイムゾーン
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# apt
RUN apt update
RUN apt install -y libopencv-dev

# install python and pip
RUN apt install -y python3 python3-pip
RUN pip install --upgrade pip

# set working directory and copy files
WORKDIR /usr/src/app
COPY ./ /usr/src/app

# install opencv
RUN pip install opencv-python
```

# おしまい

タイムゾーン設定は忘れないようにしなければですね。いい勉強になりました。