Install OpenCV in a Docker container

I’m attempting to Dockerise a Python application, which depends on OpenCV. I’ve tried several different ways, but I keep getting… ImportError: No module named cv2 when I attempt to run the application.

Here’s my current Dockerfile.

  • Kubernetes/Spring Cloud Dataflow stream > spring.cloud.stream.bindings.output.destination is ignored by producer
  • Docker: multiple PHP7-FPM containers on different ports
  • How to dockerize maven project? and how many ways to accomplish it?
  • Add -f parameter when running Docker Toolbox
  • Dockerize Spring Boot Java app with Kafka, Zookeeper, and MongoDB [closed]
  • Google Cloud components not being enabled
  • FROM python:2.7
    
    MAINTAINER Ewan Valentine <ewan@theladbible.com>
    
    RUN mkdir -p /usr/src/app 
    WORKDIR /usr/src/app 
    
    # Various Python and C/build deps
    RUN apt-get update && apt-get install -y \ 
        wget \
        build-essential \ 
        cmake \ 
        git \
        pkg-config \
        python-dev \ 
        python-opencv \ 
        libopencv-dev \ 
        libav-tools  \ 
        libjpeg-dev \ 
        libpng-dev \ 
        libtiff-dev \ 
        libjasper-dev \ 
        libgtk2.0-dev \ 
        python-numpy \ 
        python-pycurl \ 
        libatlas-base-dev \
        gfortran \
        webp \ 
        python-opencv 
    
    # Install Open CV - Warning, this takes absolutely forever
    RUN cd ~ && git clone https://github.com/Itseez/opencv.git && \ 
        cd opencv && \
        git checkout 3.0.0 && \
        cd ~ && git clone https://github.com/Itseez/opencv_contrib.git && \
        cd opencv_contrib && \
        git checkout 3.0.0 && \
        cd ~/opencv && mkdir -p build && cd build && \
        cmake -D CMAKE_BUILD_TYPE=RELEASE \
        -D CMAKE_INSTALL_PREFIX=/usr/local \ 
        -D INSTALL_C_EXAMPLES=ON \ 
        -D INSTALL_PYTHON_EXAMPLES=ON \ 
        -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ 
        -D BUILD_EXAMPLES=OFF .. && \
        make -j4 && \
        make install && \ 
        ldconfig
    
    COPY requirements.txt /usr/src/app/
    RUN pip install --no-cache-dir -r requirements.txt
    
    COPY . /usr/src/app 
    

    And my requirements.txt file

    Flask==0.8
    gunicorn==0.14.2
    requests==0.11.1
    bs4==0.0.1
    nltk==3.2.1
    pymysql==0.7.2
    xlsxwriter==0.8.5
    numpy==1.11
    Pillow==3.2.0
    cv2==1.0
    pytesseract==0.1
    

  • How to share volumes across multiple hosts in docker engine swarm mode?
  • Unable to install docker
  • Docker Swarm connection between containers refused for some containers
  • run nginx in docker with another application
  • Initialization of schema during oracle initialization using docker file
  • Docker Installation Error on Windows behind Firewall
  • 4 Solutions collect form web for “Install OpenCV in a Docker container”

    Fixed with a slightly different set-up

    FROM python:2.7
    
    MAINTAINER Ewan Valentine <ewan@theladbible.com>
    
    RUN mkdir -p /usr/src/app 
    WORKDIR /usr/src/app 
    
    # Various Python and C/build deps
    RUN apt-get update && apt-get install -y \ 
        wget \
        build-essential \ 
        cmake \ 
        git \
        unzip \ 
        pkg-config \
        python-dev \ 
        python-opencv \ 
        libopencv-dev \ 
        libav-tools  \ 
        libjpeg-dev \ 
        libpng-dev \ 
        libtiff-dev \ 
        libjasper-dev \ 
        libgtk2.0-dev \ 
        python-numpy \ 
        python-pycurl \ 
        libatlas-base-dev \
        gfortran \
        webp \ 
        python-opencv \ 
        qt5-default \
        libvtk6-dev \ 
        zlib1g-dev 
    
    # Install Open CV - Warning, this takes absolutely forever
    RUN mkdir -p ~/opencv cd ~/opencv && \
        wget https://github.com/Itseez/opencv/archive/3.0.0.zip && \
        unzip 3.0.0.zip && \
        rm 3.0.0.zip && \
        mv opencv-3.0.0 OpenCV && \
        cd OpenCV && \
        mkdir build && \ 
        cd build && \
        cmake \
        -DWITH_QT=ON \ 
        -DWITH_OPENGL=ON \ 
        -DFORCE_VTK=ON \
        -DWITH_TBB=ON \
        -DWITH_GDAL=ON \
        -DWITH_XINE=ON \
        -DBUILD_EXAMPLES=ON .. && \
        make -j4 && \
        make install && \ 
        ldconfig
    
    COPY requirements.txt /usr/src/app/
    RUN pip install --no-cache-dir -r requirements.txt
    
    COPY . /usr/src/app 
    

    Thanks for posting this. I ran into the same issue and tried your solution and although it seemed to install OpenCV it left me with an issue of conflicting versions of the Python six library so I took a different route. I think a simpler way to do this is to install Anaconda in your container and then add OpenCV. I’m using Python 2 so my entire Dockerfile to get OpenCvv installed is just:

    FROM continuumio/anaconda
    EXPOSE 5000
    
    ADD . /code-directory
    WORKDIR code-directory
    RUN conda install opencv
    
    CMD ["python", "run-code.py"]
    

    This will install Anaconda from the continuumio/anaconda Dockerfile and then it will use Anaconda to install opencv. There is a seperate continuumio Dockerfile for Python 3 if you need that as well.

    Here’s an image that is built on Ubuntu 16.04 with Python2 + Python3 + OpenCV. You can pull it using
    docker pull chennavarri/ubuntu_opencv_python

    Here’s the Dockerfile (provided in the same dockerhub repo mentioned above) that will install opencv for both python2 and python3 on Ubuntu 16.04 and also sets the appropriate raw1394 link. Copied from https://github.com/chennavarri/docker-ubuntu-python-opencv

    FROM ubuntu:16.04
    MAINTAINER Chenna Varri
    
    RUN apt-get update
    RUN apt-get install -y build-essential apt-utils
    
    RUN apt-get install -y cmake git libgtk2.0-dev pkg-config libavcodec-dev \
      libavformat-dev libswscale-dev
    RUN  apt-get update && apt-get install -y python-dev python-numpy \
      python3 python3-pip python3-dev libtbb2 libtbb-dev \
      libjpeg-dev libjasper-dev libdc1394-22-dev \
      python-opencv libopencv-dev libav-tools python-pycurl \
      libatlas-base-dev gfortran webp qt5-default libvtk6-dev zlib1g-dev
    
    RUN pip3 install numpy
    
    RUN apt-get install -y python-pip
    RUN pip install --upgrade pip
    
    RUN cd ~/ &&\
        git clone https://github.com/Itseez/opencv.git &&\
        git clone https://github.com/Itseez/opencv_contrib.git &&\
        cd opencv && mkdir build && cd build && cmake  -DWITH_QT=ON -DWITH_OPENGL=ON -DFORCE_VTK=ON -DWITH_TBB=ON -DWITH_GDAL=ON -DWITH_XINE=ON -DBUILD_EXAMPLES=ON .. && \
        make -j4 && make install && ldconfig
    
    # Set the appropriate link
    RUN ln /dev/null /dev/raw1394
    
    RUN cd ~/opencv
    

    Some additional instructions for people newly starting with Docker:

    • In the directory where you put this Dockerfile, build the docker image as docker build -t ubuntu_cv .

    • Once the image is built, you can check by doing docker images

      REPOSITORY   TAG       IMAGE ID      CREATED             SIZE
      
      ubuntu_cv  latest    6210ddd6346b   24 minutes ago      2.192 GB
      
    • You can start a docker container as docker run -t -i ubuntu_cv:latest

    from    ubuntu:12.10
    
    # Ubuntu sides with libav, I side with ffmpeg.
    run echo "deb http://ppa.launchpad.net/jon-severinsson/ffmpeg/ubuntu quantal main" >> /etc/apt/sources.list
    run apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1DB8ADC1CFCA9579
    
    
    run apt-get update
    run apt-get install -y -q wget curl
    run apt-get install -y -q build-essential
    run apt-get install -y -q cmake
    run apt-get install -y -q python2.7 python2.7-dev
    run wget 'https://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg' && /bin/sh setuptools-0.6c11-py2.7.egg && rm -f setuptools-0.6c11-py2.7.egg
    run curl 'https://raw.github.com/pypa/pip/master/contrib/get-pip.py' | python2.7
    run pip install numpy
    run apt-get install -y -q libavformat-dev libavcodec-dev libavfilter-dev libswscale-dev
    run apt-get install -y -q libjpeg-dev libpng-dev libtiff-dev libjasper-dev zlib1g-dev libopenexr-dev libxine-dev libeigen3-dev libtbb-dev
    add build_opencv.sh /build_opencv.sh
    run /bin/sh /build_opencv.sh
    run rm -rf /build_opencv.sh
    
    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.