我无法在docker中安装opencv-contrib-python

jas*_*son 11 python opencv docker

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

我试过了,

pip install opencv-contrib-python-headless
Run Code Online (Sandbox Code Playgroud)

然后,我累了 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"] 
Run Code Online (Sandbox Code Playgroud)

但我不能让其中任何一个工作.请告诉我如何通过需求文件在docker中安装上面的内容?

更多参考资料(我尝试的事情): 无法使用opencv安装/运行docker

和

from .cv2 import*ImportError:libgthread-2.0.so.0:无法打开共享对象文件:没有这样的文件或目录

lar*_*sks 10

我的猜测是你看到-alpine版本失败了,因为opencv包是二进制发行版(它不只是Python代码),而且它可能还没有为Alpine构建.Alpine使用的C库与其他所有东西都不同(Alpine使用MUSL libc,而其他人则使用Glibc); 有可能opencv代码库甚至不会为MUSL构建.或者也许只是没有人开始构建二进制包.在任何一种情况下,您最好使用以下选项之一:

如果我使用股票python:3.5图像(不是阿尔卑斯山)它只是工作:

$ 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
>>>
Run Code Online (Sandbox Code Playgroud)

如果我使用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
>>>
Run Code Online (Sandbox Code Playgroud)

正如我们从包查询中看到的那样,该库归libglib2.0包所有,默认情况下,它不会安装-slim在Python映像的版本中.我们可以解决这个问题

# apt-get update
# apt-get -y install libglib2.0
Run Code Online (Sandbox Code Playgroud)

现在它按预期运行:

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
>>>
Run Code Online (Sandbox Code Playgroud)

你可以使用Dockerfile类似的方法构建自己的图像并结合此修复 :

FROM python:3.5-slim
RUN apt-get update && apt-get -y install libglib2.0; apt-get clean
RUN pip install opencv-contrib-python-headless
Run Code Online (Sandbox Code Playgroud)

更新

关于你的评论:如果你想让一个软件包可用于你的容器中运行的代码那么,是的,你必须安装它.它还会从哪里来?

如果opencv-contrib-python-headless包含在您的中 requirements.txt,那么评论中发布的内容应该可以正常工作:

FROM python:3.5
COPY . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3"]
CMD ["app.py"]
Run Code Online (Sandbox Code Playgroud)

如果你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"]
Run Code Online (Sandbox Code Playgroud)