【问题标题】:Trouble installing opencv in docker container using pip使用 pip 在 docker 容器中安装 opencv 时遇到问题
【发布时间】:2018-06-20 14:26:45
【问题描述】:

我想构建一个包含 scikit-learn、opencv 和 numpy 的 python docker 容器。不幸的是,我找不到包含所有这些的预构建容器,但我确实找到了下面包含 numpy 和 scikit-learn 的容器。

https://hub.docker.com/r/frolvlad/alpine-python-machinelearning/

我仍然需要安装 opencv,所以在我的 docker 文件中我包含了一个RUN pip install opencv-python。但是,我不断收到以下错误:

Could not find a version that satisfies the requirement opencv-python (from version: ) No matching distribution found for opencv-python

我在网上读到的每一件事都说pip install opencv-python 会起作用,但由于某种原因它对我不起作用。可能是python包的问题吗?

感谢任何帮助

另外,我将在下面包含我的完整 Dockerfile,我的目标是使用 openFaas,它是一个无服务器框架,所以我的 Dockerfile 可能看起来很奇怪:

FROM frolvlad/alpine-python-machinelearning

RUN apk update
RUN apk upgrade

# Alternatively use ADD https:// (which will not be cached by Docker builder)
RUN apk --no-cache add curl \
    && echo "Pulling watchdog binary from Github." \
    && curl -sSL         
https://github.com/openfaas/faas/releases/download/0.8.0/fwatchdog > /usr/bin/fwatchdog \
    && chmod +x /usr/bin/fwatchdog \
    && apk del curl --no-cache

# Add non root user
RUN addgroup -S app && adduser -S -g app app
RUN chown app /home/app

RUN pip install -U pip

USER app

ENV PATH=$PATH:/home/app/.local/bin

WORKDIR /home/app/

RUN pip install opencv-python

RUN mkdir -p function
RUN touch ./function/__init__.py
WORKDIR /home/app/function/
RUN pip install --user app opencv-python

WORKDIR /home/app/
COPY function           function

ENV fprocess="python index.py"

HEALTHCHECK --interval=1s CMD [ -e /tmp/.lock ] || exit 1

CMD ["fwatchdog"]

【问题讨论】:

    标签: python opencv docker


    【解决方案1】:

    我也遇到了这个问题。事实证明这不起作用,因为opencv-python 没有任何用于 Alpine 的预构建轮子(您用作基础 docker 映像的发行版)。

    opencv-python 包上的this 问题中的对话更详细地解释了为什么会发生这种情况。 TL;DR 是:如果你真的需要使用 Alpine,你可以尝试opencv-python 的manylinux 轮子的forcing the installation,但这可能会中断。如果您需要保留 Alpine,最好的选择是从源代码构建模块。由于您在 OpenFAAS 上运行它,我怀疑您会希望保持较小的大小,因此从源代码构建可能是您的一个不错的选择。

    如果您没有连接到 Alpine,我建议您转移到不同的基础 docker 映像。如果您不确定要使用哪个图像作为基础,我会推荐python:3.7-slim,因为它已经安装了 Python(用3.7 代替您使用的任何版本,但真的...... 3.7 很好) .使用此容器,您只需运行 pip install opencv-python numpy scipy 即可安装所有三个所需的软件包。您的 Dockerfile 的其余部分应该大部分未修改即可工作;您只需要使用apt 而不是apk 来安装/卸载curl

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,但由于需要 ARMv7 映像(因为它应该在 Raspberry Pi 上运行),所以更加复杂。我在这里整理了一个 Dockerfile 和一个预构建的 OpenCV 安装:alpine-opencv-docker

      您也可以在 Dockerfile 中自行编译,但这需要大量时间(可能接近一整天),通过:

      ENV OPENCV_VER 3.3.0
      ENV OPENCV https://github.com/opencv/opencv/archive/${OPENCV_VER}.tar.gz
      
      # build dependencies
      RUN apk add -U --no-cache --virtual=build-dependencies \
          build-base \
          clang \
          clang-dev ninja \
          cmake \
          freetype-dev \
          g++ \
          jpeg-dev \
          lcms2-dev \
          libffi-dev \
          libgcc \
          libxml2-dev \
          libxslt-dev \
          linux-headers \
          make \
          musl \
          musl-dev \
          openjpeg-dev \
          openssl-dev \
          python3-dev \
          zlib-dev \
          && apk add --no-cache \
          curl \
          freetype \
          gcc \
          jpeg \
          libjpeg \
          openjpeg \
          python3 \
          tesseract-ocr \
          zlib
      
      # build opencv from source
      RUN mkdir /opt && cd /opt && \
          curl -L $OPENCV | tar zx && \
          cd opencv-$OPENCV_VER && \
          mkdir build && cd build && \
          cmake -G Ninja \
                -D CMAKE_BUILD_TYPE=RELEASE \
                -D CMAKE_INSTALL_PREFIX=/usr/local \
                -D WITH_FFMPEG=NO \
                -D WITH_IPP=NO \
                -D PYTHON_EXECUTABLE=/usr/bin/python3 \
                -D WITH_OPENEXR=NO .. && \
          ninja && ninja install && \
          cp -p $(find /usr/local/lib/python3.6/site-packages -name cv2.*.so) \
      /usr/lib/python3.6/site-packages/cv2.so
      

      我通过在一个巨大的 EC2 虚拟机中编译上述内容来整合我的包,然后从容器中提取以下路径:

      • /usr/lib/python3.6/site-packages/cv2.so
      • /usr/local/include/opencv
      • /usr/local/include/opencv2
      • /usr/local/lib

      然后我可以通过我的 Dockerfile 中的普通 ADD 命令将它们添加回来,所以现在每个想要启动容器的人都可以在几秒钟内完成,而不是几天。

      【讨论】:

        【解决方案3】:

        你可以使用这个https://hub.docker.com/r/jjanzic/docker-python3-opencv

        它是带有 python 3.7 和 opencv 4.1.0 的 Docker 映像

        docker run -it jjanzic/docker-python3-opencv python
        >>> import cv2
        

        那么你可以通过 pip 安装opencv-python==4.1.2.30

        【讨论】:

        • 现在已经更新到python 3.9了。如果您想在 2021 年 1 月之前将它与 Tensorflow 一起使用,那就不太好。
        【解决方案4】:

        使用python:3.7-alpine,我可以同时安装numpyopencv-utils。我需要做的唯一更改是将g++ 作为附加包添加到我在 Dockerfile 中的 apk 命令中

        RUN apk --no-cache add g++ ${ADDITIONAL_PACKAGE}
        

        希望对你有帮助!!

        【讨论】:

          【解决方案5】:

          我发现这篇文章 Using Alpine can make Python Docker builds 50x slower 在处理这个问题时非常有帮助。以下是其中的摘录:

          ...标准 Linux 轮子不适用于 Alpine Linux。

          为什么?大多数 Linux 发行版使用 GNU 版本 (glibc) 几乎每个 C 程序都需要的标准 C 库, 包括 Python。但是 Alpine Linux 使用 musl,那些二进制轮子是 针对 glibc 编译,因此 Alpine 禁用了 Linux 轮 支持。

          如今,大多数 Python 包都包含 PyPI 上的二进制轮子, 显着加快安装时间。但是如果你使用的是 Alpine Linux 您需要编译每个 Python 包中的所有 C 代码 使用。

          这也意味着您需要弄清楚每个系统库 自己依赖。

          希望这会增加来自 rnorris 的评论/建议,以使用不同的基本图像(如果您未与 Alpine 结婚)。

          这篇文章对我调试这个问题很有帮助。我希望它也适合你!

          【讨论】:

            【解决方案6】:

            解决方法:

            pip3 install --upgrade setuptools pip

            pip3 安装 opencv-python

            来源 > https://github.com/3b1b/manim/issues/1213#issuecomment-703272203

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-01-16
              • 2020-08-27
              • 2022-01-05
              • 2017-10-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多