OpenNH

日常のひとこま(自分用のメモとかあれこれ)

Dockerでpython3+OpenCVの環境を整えてみる

Macbook air を購入したので、お試しがてらDockerでOpenCVの開発環境を整えてみようとしたらハマったので、その対処などをメモしておきます。

目次

やりたいこと

Dockerコンテナ上で、以下の環境を整える。

  • Docker image : Ubuntu18.04:latest
  • Python3
  • OpenCV

環境

M1のMacbook向けのDocker desktop for M1がインストール済みであることを前提にしています。

$ system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: MacBook Air
      Model Identifier: MacBookAir10,1
      Chip: Apple M1
      Total Number of Cores: 8 (4 performance and 4 efficiency)
      Memory: 16 GB
      System Firmware Version: 6723.50.2

$ docker --version
Docker version 20.10.1, build 831ebeae96

$ docker-compose --version
docker-compose version 1.27.4, build 40524192

環境構築開始

イメージの取得とコンテナ起動

まずはDocker Image取得して、コンテナを起動します。
今回はUbuntu18.04の最新イメージを利用しています。

$ docker run -it ubuntu:18.04

そうすると、コンテナ内に入ることができます。
フォルダ構成はこんな感じ。

root@a00000000z:/# ls
bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

以降、特筆しない限りコンテナ内部のコマンド操作になります。

Python3 + OpenCVのインストール

まずはaptを最新化します。

$ apt update -y
$ apt upgrade -y

python3をインストールします。今回はお試しなので、最新版ではなくpython3としてインストールしたので、python3.6になっています。

$ apt install -y python3

続いて必要なツール類をインストールします。

$ apt install python3-dev python3-pip python3-setuptools -y

そして、pipでopencvをインストールしていきます。
ここで、色々エラーが出たりしました。めんどくせぇ。。。

$ python3 -m pip install opencv-python

エラー1つ目: skbuildモジュールがない !

skbuildモジュールがないと怒られました。

ModuleNotFoundError: No module named 'skbuild'

なので、単純にskbuildをインストールしてあげます。 これで1つ目は解決。ここで、インストールするモジュール名はscikit-buildになります。

$ python3 -m pip install scikit-build
--<略>--
Successfully installed distro-1.5.0 packaging-20.8 pyparsing-2.4.7 scikit-build-0.11.1

エラー2つ目:Numpy関連部分でエラー!

skbuildをインストールして、再度pip install opencv-pythonをするとNumpy関連の部分でエラーが発生しました。Numpyを事前にインストールしておくかってことで、Numpyをインストール。

$ python3 -m pip install numpy

numpyをpipインストールする際のエラー

今度はまた別のエラーが。ぐぬぬ…。
以下のようなエラーが出てnumpyがインストールできない…

--<略>--
Command "/usr/bin/python3 -u -c "import setuptools, tokenize;file='/tmp/pip-build-mwnvdr7r/numpy/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, file, 'exec'))" install --record /tmp/pip-dxshvpmv-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-mwnvdr7r/numpy/

対処

pipsetuptoolsを最新化する必要があったようです。
無事にnumpyがインストールできました。

$ python3 -m pip install --upgrade pip setuptools

$ python3 -m pip install numpy
--<略>--
Successfully installed numpy-1.19.4 

参考にしたサイト

いろんなサイトを参考にして解決を試した結果、こちらのサイトに記載があるように、pipsetuptoolsを最新化したら解決しました。@Ray11187034(Twitter)さんありがとうございます!

keymaso.com

OpenCVようやく入る

これでようやくopencvを入れることができました。

$ python3 -m pip install opencv-python
--<略>--
Successfully installed opencv-python-4.4.0.46

ちゃんとインストールされているか確認します。 大丈夫そうですね。

$ python3
Python 3.6.9 (default, Oct  8 2020, 12:12:24) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.4.0'

コンテナからDocker ImageとDockerfileを作成

こちらのサイトを参考にして、今まで作成したコンテナからいつでも環境構築できるようにDockerfileを作成しました。

qiita.com

環境構築が終わったので、コンテナを終了させます。

$ exit   # `Control+D`でも可

以降、特筆しない限りターミナルでのコマンド操作になります。
ここでは、コマンドのみ記載しますので詳細は上記サイトを確認してください。

# コンテナIDの確認
$ docker ps -a

# Docker Imageの作成
$ docker container commit <container ID> <任意のimage name>

# 作成したImageの確認
$ docker images

# Dockerfileへ書き出し
$ dfimage <docker image name>

これでDockerfileへも書き出すことができました!

Dockerfileをつくるとこんな感じ

FROM ubuntu:18.04

RUN apt update -y && apt upgrade -y
RUN apt install -y python3
RUN apt install -y python3-dev python3-pip python3-setuptools 
RUN python3 -m pip install --upgrade pip setuptools
RUN python3 -m pip install scikit-build numpy 
RUN yes 1 | python3 -m pip install opencv-python

終わり。 (最後適当になっちゃった。。。