Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Dockerで、Django,Anaconda3がinstallされたimageを作ってみる

概要

Dockerで、Django,Anaconda3,opencvがinstallされたimageを作ってみる。

参考書籍・サイト

docs.continuum.io

opencvで参考にしたサイト:

github.com

やって見たこと

djangoのテストアプリをlocalに作る

  • pyenvを使って、pythonのversionをanaconda3で環境を作っておく。
$ pyenv global anaconda3-2.5.0
$ pyenv virtualenv dockeranaconda
$ pyenv activate dockeranaconda

# djangoをinstallして、projectを作成する
$ pip install django
$ django-admin startproject dockersite
$ pip freeze > requirements.txt
$ ls
Dockerfile  dockersite  manage.py     requirements.txt

# この時点で、runserverして、127.0.0.1:8000に it workedが表示されればOK
$ python manage.py runserver

Dockerfileを作成する

とりあえず、djangoの公式サイトに則って、以下のように作成して見ました! 変更したのは、FROMの箇所です。

FROM continuumio/anaconda3 # ここは、anaconda3の公式パッケージを持ってきた

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        postgresql-client \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY . .

EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Dockerfileからimageを作成してみる。

# djangotestという名前のimageを、Dockerfileから生成する
docker build -t djangotest .

無事作成できた!

作成したimageからコンテナを起動してみる。

docker run -i -t -d djangotest /bin/bash

localhost:8000にあくせすしてみる。。。ページが表示されず。。。

多分portを指定してないせいだな!

$ docker run -d -p 8000:8000 djangotest

これで試してみる。。。できた!

とりあえず、これでpython, django, anaconda3 が含まれたimageができた!

opencvを入れてみる。

Dockerfileに、opencvを入れる記述を入れてみる。

参考サイト:

github.com

RUN apt-get update && \
        apt-get install -y \
        build-essential \
        cmake \
        git \
        wget \
        unzip \
        yasm \
        pkg-config \
        libswscale-dev \
        libtbb2 \
        libtbb-dev \
        libjpeg-dev \
        libpng-dev \
        libtiff-dev \
        libjasper-dev \
        libavformat-dev \
        libpq-dev

RUN wget https://github.com/Itseez/opencv/archive/3.0.0.zip \
&& unzip 3.0.0.zip \
&& mkdir /opencv-3.0.0/cmake_binary \
&& cd /opencv-3.0.0/cmake_binary \
&& cmake -DBUILD_TIFF=ON \
  -DBUILD_opencv_java=OFF \
  -DWITH_CUDA=OFF \
  -DENABLE_AVX=ON \
  -DWITH_OPENGL=ON \
  -DWITH_OPENCL=ON \
  -DWITH_IPP=ON \
  -DWITH_TBB=ON \
  -DWITH_EIGEN=ON \
  -DWITH_V4L=ON \
  -DBUILD_TESTS=OFF \
  -DBUILD_PERF_TESTS=OFF \
  -DCMAKE_BUILD_TYPE=RELEASE \
  -DCMAKE_INSTALL_PREFIX=$(python3.5 -c "import sys; print(sys.prefix)") \
  -DPYTHON_EXECUTABLE=$(which python3.5) \
  -DPYTHON_INCLUDE_DIR=$(python3.5 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
  -DPYTHON_PACKAGES_PATH=$(python3.5 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") .. \
&& make install \
&& rm /3.0.0.zip \
&& rm -r /opencv-3.0.0

再びimageをbuildしてみる。

$ docker build -t djangotest .

めっちゃ時間かかる、、、15分くらいしたら無事imageをbuildできた!

そのimageを元にcontainerをrunできるか確認してみる。

$ docker run -d -p 8000:8000 djangotest 

無事 It worked! が表示された!

できたコンテナのshell でanacondaとかopencvを使ってみる。

# 起動中のcontainerをshellで動かしてみる。
$ docker exec -it  container_name or container_id /bin/bash

anaconda系がちゃんと動くか確認

>>> import numpy
>>> import matplotlib
import scipy

error出ないからanacondaはちゃんと入ってるぽい。

opencvを試してみる。

>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /opt/conda/lib/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /opt/conda/lib/libopencv_ml.so.3.0)

やっぱinstallでerror出てからうまくopencvは、installできてなかったぽいな。。。

ちょっと多分、これは解決できそうにないので、opencvは別の方法を試してみる。

opencvを別の方法で入れてみる。

anaconda経由で入れるのが、楽そうなので、それをdockerfileに書き込んでみる。

参照サイト:

qiita.com

以下のコードを追記。

RUN conda install -y --channel https://conda.anaconda.org/menpo opencv3

これで再度、$ docker build -t djangocv . してみる。。。。なんか怪しい挙動はあったが無事imageはbuildできた!

$ docker run -d -p 8000:8000 djangocvでコンテナを起動してみる。

docker exec -i -t container_id /bin/bashでコンテナをshellで動かしてみる。

>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: libgtk-x11-2.0.so.0: cannot open shared object file: No such file or directory

またもやerror!cv2は入ってるぽいけど、やっぱopencvはソースからビルドするしかなさそうな気がする。。とりあえず、anacondaは無事入ったので、anacondaで色々進めていこう!