使用pip在Docker容器中安装opencv出现问题

cjn*_*ash 9 python opencv docker

我想构建一个具有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

我在网上阅读的每件事都说a 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"]
Run Code Online (Sandbox Code Playgroud)

rno*_*ris 10

我也刚遇到这个问题。事实证明,这是行不通的,因为opencv-python没有用于Alpine(您正在用作基本docker映像的发行版)的任何预制轮子。

在交谈中对这个问题opencv-python包解释了为什么这种情况发生在更多的细节。TL; DR是:如果您确实需要使用Alpine,则可以尝试强制安装 manylinux轮opencv-python,但这可能会中断。如果您需要保留Alpine,最好的选择是从源代码构建模块。由于您是在OpenFAAS上运行此程序,因此我怀疑您希望保持较小的尺寸,因此从源代码进行构建可能对您来说是一个不错的选择。

如果您不喜欢Alpine,我建议您转移到其他基础docker映像。如果您不确定要使用哪个映像作为基础,我会建议您使用python:3.7-slim,因为它将随已安装的Python一起安装(用3.7您使用的任何版本代替,但3.7确实不错)。使用此容器,您可以简单地运行pip install opencv-python numpy scipy以安装所有三个所需的软件包。您的Dockerfile的其余部分应该大部分未经修改即可工作;您只需要curl使用apt而不是进行安装/卸载apk

  • 感谢您指出了这一点。安装成功,但在此容器内的 python 中运行“import cv2”时,我也看到此错误。我已经找到了解决此问题的方法,并且我将根据附加要求更新我的答案。 (2认同)

Jan*_*oom 5

我遇到了同样的问题,但由于需要 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
Run Code Online (Sandbox Code Playgroud)

我通过在一个巨大的 EC2 虚拟机中编译上述内容来将我的包放在一起,然后从容器中拉出以下路径:

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

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


小智 5

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

...标准的 Linux 轮子在 Alpine Linux 上不起作用。

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

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

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

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

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