python - 我无法在 docker 中安装 opencv-contrib-python
问题描述
我尝试安装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 中安装上述内容?
更多参考资料(我尝试过的事情): 无法使用 opencv 安装/运行 docker
和
解决方案
我的猜测是,您看到-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
>>>
正如我们从包查询中看到的那样,该库归包所有,在 Python 映像版本中libglib2.0-0
默认情况下显然没有安装该库。-slim
我们可以解决这个问题:
# 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
,那么评论中发布的内容应该可以正常工作:
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"]
推荐阅读
- java - Spring data JPA 使用 Beanutils.copyProperties 更新一对多关系
- python - 我可以使用 Firebase 函数来接收应该发送到端口上的服务器的数据吗?
- python - 在python中将首字母与全名输入分开而不使用split
- assembly - 如何从 qword(四字)中减去 dword(双字)?
- php - 双 URL 触发器创建 move_uploaded_file() 失败
- python - 无法让小部件更新其大小
- python - 如何在gyame中同时移动一个班级的多个实例
- python - 从 yahoo.finance 中提取数据
- python - 用python渲染jpg字节数组序列
- ios - APNS 将通知修改为静默通知