【问题标题】:I'm unable to install opencv-contrib-python in docker我无法在 docker 中安装 opencv-contrib-python
【发布时间】:2018-11-15 21:34:23
【问题描述】:

我尝试安装 opencv-contrib-python,但无法让它在 docker 上运行。它说 找不到满足 opencv-contrib-python 要求的版本

我试过了,

pip install opencv-contrib-python-headless

然后,我累了 https://github.com/cassiobotaro/docker-opencv-contrib/blob/master/Dockerfile 我也试过了,

    FROM python:3.5-alpine

    COPY . /app
    WORKDIR /app


    RUN apk add --no-cache ca-certificates
    RUN apk add --no-cache git build-base musl-dev alpine-sdk cmake clang clang-dev make gcc g++ libc-dev linux-headers

    RUN mkdir /tmp/opencv
    WORKDIR /tmp/opencv
    RUN wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.1.zip
    RUN unzip opencv.zip
    RUN wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.4.1.zip
    RUN unzip opencv_contrib.zip
    RUN mkdir /tmp/opencv/opencv-3.4.1/build

    WORKDIR /tmp/opencv/opencv-3.4.1/build
    RUN cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/tmp/opencv/opencv_contrib-3.4.1/modules -D BUILD_DOCS=OFF BUILD_EXAMPLES=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_opencv_java=OFF -D BUILD_opencv_python=OFF -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=OFF ..
    RUN make -j4
    RUN make install

    RUN rm -rf /tmp/opencv


    RUN pip3 install -r requirements.txt

CMD ["app.py"] 

但我无法让其中任何一个工作。请让我知道如何仅通过需求文件在 docker 中安装上述内容?

更多参考资料(我尝试过的事情): Unable to install/run docker with opencv

from .cv2 import * ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory

【问题讨论】:

  • 当您搜索该错误时,您是否尝试过 google 建议的任何解决方案?关于 alpine 上遇到该错误的人,我得到了很多点击。即github.com/skvark/opencv-python/issues/75
  • 在您的自定义镜像(不是 github 镜像)中,您使用的是哪个基础镜像?我一直在使用 python 3.6-slim 和 3.5-slim 没有问题。还有,github图片怎么了?
  • @C.Nivs 你好。我尝试了 3.5-slim,它已经安装了库,但是在运行 docker 时出现任何错误。 错误:ImportError:libgthread-2.0.so.0:无法打开共享对象文件:没有这样的文件或目录
  • @C.Nivs 运行 github docker image 时出现此错误:
  • @C.Nivs E: Unable to locate package libjasper-dev 命令'/bin/sh -c apt-get update && apt-get install -y build-essential cmake wget git unzip yasm pkg -config libjpeg-dev libtiff-dev libjasper-dev libpng-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libatlas-base-dev gfortran libtbb2 libtbb-dev libpq-dev && apt-get -y clean all && rm - rf /var/lib/apt/lists/*' 返回一个非零代码:100

标签: python docker opencv


【解决方案1】:

我的猜测是您在-alpine 版本上看到了失败,因为opencv 包是一个二进制分发包(它不仅仅是 Python 代码),而且它可能不是为 Alpine 构建的。 Alpine 使用了一个不同于其他所有东西的 C 库(Alpine 使用 MUSL libc,而其他几乎所有东西都使用 Glibc); opencv 代码库有可能甚至不会为 MUSL 构建。或者也许只是没有人开始构建二进制包。无论哪种情况,您最好选择以下选项之一:

如果我使用股票 python:3.5 图像(不是 Alpine 图像),它就可以工作:

$ docker run -it --rm python:3.5 bash
root@95c81040aeaf:/# pip install opencv-contrib-python-headless
Collecting opencv-contrib-python-headless
  Downloading https://files.pythonhosted.org/packages/c2/50/2427b286652cf64ea3618d08bfba38c04b6571f6f2c054e950367a2f309f/opencv_contrib_python_headless-3.4.3.18-cp35-cp35m-manylinux1_x86_64.whl (24.0MB)
    100% |████████████████████████████████| 24.1MB 2.4MB/s
Collecting numpy>=1.11.1 (from opencv-contrib-python-headless)
  Downloading https://files.pythonhosted.org/packages/86/04/bd774106ae0ae1ada68c67efe89f1a16b2aa373cc2db15d974002a9f136d/numpy-1.15.4-cp35-cp35m-manylinux1_x86_64.whl (13.8MB)
    100% |████████████████████████████████| 13.8MB 4.7MB/s
Installing collected packages: numpy, opencv-contrib-python-headless
Successfully installed numpy-1.15.4 opencv-contrib-python-headless-3.4.3.18
root@95c81040aeaf:/# python
Python 3.5.6 (default, Nov 16 2018, 22:45:03)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>>

如果我使用3.5-slim 标签,我会看到您报告的相同错误:

root@63dca11a527f:/# python
Python 3.5.5 (default, May  5 2018, 03:17:29)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/site-packages/cv2/__init__.py", line 3, in <module>
    from .cv2 import *
ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory
>>>

正如我们从package query 中看到的那样,该库归libglib2.0-0 包所有,而-slim 版本的Python 映像中显然没有默认安装该包。我们可以解决这个问题:

# apt-get update
# apt-get -y install libglib2.0-0

现在它按预期运行:

root@63dca11a527f:/# python
Python 3.5.5 (default, May  5 2018, 03:17:29)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>>

您可以使用 Dockerfile点赞:

FROM python:3.5-slim
RUN apt-get update && apt-get -y install libglib2.0-0; apt-get clean
RUN pip install opencv-contrib-python-headless

更新

关于您的评论:如果您希望一个包可用于编码 然后在你的容器中运行,是的,你必须安装它。在哪里 否则它会来自哪里?

如果opencv-contrib-python-headless 包含在您的 requirements.txt,那么在 cmets 中发布的内容应该可以使用 很好:

FROM python:3.5
COPY . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3"]
CMD ["app.py"]

如果您requirements.txt 不包含此内容(为什么不包含此内容?),您会 需要显式安装:

FROM python:3.5
RUN pip install opencv-contrib-python-headless
COPY . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3"]
CMD ["app.py"]

【讨论】:

  • 我已经在这个答案中展示了我在这里运行的每一个命令。你要什么代码?
  • 对不起百灵鸟,但我对 docker 很陌生,我正在尝试 dockerfile 中的不同变体来让这个模块工作,但它总是崩溃。我的 docker 文件中的当前代码如下所示: FROM python:3.5 COPY 。 /app WORKDIR /app RUN pip3 install -r requirements.txt 入口点 ["python3"] CMD ["app.py"]
  • 我需要在同一图像上安装 opencv 作为命令吗??
  • 对不起,我在这里完全是菜鸟!
  • 我认为您可能想就该问题提出一个新问题;这里的 cmets 并不是进行扩展题外讨论的地方。您可能希望在 app.py 中包含负责启动您的服务的任何代码。
【解决方案2】:

我遇到了同样的问题。我正在使用python-slim。它是由于运行时依赖性而发生的。在 DockerFile 中添加以下代码 sn-p 以安装运行时依赖项。

安装 OpenCV 的运行时依赖项

运行 apt-get update 运行 apt-get -y install libglib2.0-0 运行 apt-get -y install libsm6 \ libxrender-dev \ libxext6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多