簡體   English   中英

使用pip在docker容器中安裝opencv時遇到問題

[英]Trouble installing opencv in docker container using pip

我想構建一個具有 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"]

我也剛遇到這個問題。 事實證明這是行不通的,因為opencv-python沒有任何用於 Alpine 的預構建輪子(您用作基礎 docker 映像的發行版)。

在交談中對這個問題opencv-python包解釋了為什么這種情況發生在更多的細節。 TL;DR 是:如果你真的需要使用 Alpine,你可以嘗試強制opencv-python安裝manylinux 輪,但這可能會中斷。 如果您需要保留 Alpine,最好的選擇是從源代碼構建模塊。 由於您在 OpenFAAS 上運行它,我懷疑您會希望保持較小的規模,因此從源代碼構建可能對您來說是一個不錯的選擇。

如果您沒有加入 Alpine,我建議您使用不同的基礎 docker 映像。 如果您不確定要使用哪個圖像作為基礎,我會推薦python:3.7-slim ,因為它已經安裝了 Python(用3.7代替您正在使用的任何版本,但實際上...... 3.7 很好) . 使用此容器,您只需運行pip install opencv-python numpy scipy即可安裝所有三個所需的軟件包。 Dockerfile 的其余部分應該在大部分情況下無需修改即可工作; 您只需要使用apt而不是apk來安裝/卸載curl

我遇到了同樣的問題,但由於需要 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/本地/lib

然后我可以通過我的 Dockerfile 中的普通ADD命令將它們添加回來,所以現在每個想要啟動容器的人都可以在幾秒鍾而不是幾天內完成。

我發現這篇文章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 結婚)。

這篇文章對我調試這個問題非常有幫助。 我希望它也適合你!

使用python:3.7-alpine ,我只能安裝numpyopencv-utils 我需要做的唯一更改是在 Dockerfile 中將g++作為附加包添加到我的 apk 命令中

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

希望這可以幫助 !!

你可以使用這個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

如果您正在進行機器學習,也許可以使用張量流圖像作為基礎:

FROM tensorflow/tensorflow:nightly-py3

在這種情況下, pip3 install opencv-python可以正常工作。

解決了:

pip3 install --upgrade setuptools pip

pip3 安裝 opencv-python

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

實際上,您不應該使用pip安裝open-cv,而必須使用OpenCV軟件包進行安裝。 如果您使用的是Windows:

http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_setup/py_setup_in_windows/py_setup_in_windows.html

然后轉到/ opencv / build / python / xxxx文件夾並將該文件夾復制到\\ Python \\ Pythonxxx \\ Lib \\ site-packages (xxx是您的Python版本)

如果您使用的是Linux環境,則只需:

 sudo apt-get install python-opencv

或者,您可以使用打開的cv中的wheel文件進​​行安裝,該文件可以從以下網站下載: https : //www.lfd.uci.edu/~gohlke/pythonlibs/#opencv選擇與您的Python版本相關的正確版本,然后運行

pip install "wheel_file_name.whl"

要測試一切運行是否順利,請運行:

import cv2 as cv
print(cv.__version__)

如果您正確執行所有操作,則不會顯示任何錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM