Python 使用pip在docker容器中安装opencv时出现问题

Python 使用pip在docker容器中安装opencv时出现问题,python,opencv,docker,Python,Opencv,Docker,我想构建一个python docker容器,其中包含scikit learn、opencv和numpy。不幸的是,我找不到包含所有这些内容的预构建容器,但我确实找到了下面包含numpy和scikit的容器 我仍然需要安装opencv,因此在docker文件中,我包含了一个运行pip install opencv python。然而,我不断得到以下错误: 找不到满足opencv python要求的版本(来自版本:) 未找到opencv python的匹配发行版 我在网上读到的每一件事都表明,一个

我想构建一个python docker容器,其中包含scikit learn、opencv和numpy。不幸的是,我找不到包含所有这些内容的预构建容器,但我确实找到了下面包含numpy和scikit的容器

我仍然需要安装opencv,因此在docker文件中,我包含了一个
运行pip install opencv python
。然而,我不断得到以下错误:

找不到满足opencv python要求的版本(来自版本:)
未找到opencv python的匹配发行版

我在网上读到的每一件事都表明,一个
pip安装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"]

我刚刚也遇到了这个问题。事实证明,这是不起作用的,因为
opencvpython
没有为Alpine(您正在使用的作为基本docker映像的发行版)预构建任何控制盘

关于
opencvpython
包的讨论更详细地解释了为什么会发生这种情况。TL;DR is:如果您真的需要使用Alpine,您可以尝试使用适用于
opencv python
的manylinux控制盘,但这可能会出现故障。如果您需要保留Alpine,最好的选择是从源代码构建模块。由于您在OpenFAAS上运行此功能,我怀疑您会希望保持较小的大小,因此从源代码构建可能是一个不错的选择


如果你不喜欢阿尔卑斯山,我建议你换一个不同的基地码头形象。如果您不确定使用哪个图像作为基础,我建议您使用
python:3.7-slim
,因为它将随已经安装的python一起提供(用
3.7
替换您正在使用的任何版本,但实际上…3.7很好)。有了这个容器,您只需运行
pip安装opencv-python-numpy-scipy
即可安装所有三个所需的软件包。Dockerfile的其余部分应该在未修改的情况下工作;您只需要使用
apt
而不是
apk
来安装/卸载
curl
,我也遇到了同样的问题,但由于需要一个ARMv7映像(因为它应该在Raspberry Pi上运行),所以更为复杂。我在这里组装了一个Dockerfile和一个预构建的OpenCV安装:

或者,您也可以在Dockerfile中编译自己,但这需要大量时间(可能接近一整天),方法是:

我通过在一个巨大的EC2虚拟机中编译上面的代码,然后从容器中提取以下路径,将我的包整合在一起:

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

然后我可以通过Dockerfile中的普通
add
命令将它们添加回来,因此现在所有想要启动容器的人都可以在几秒钟内完成。

使用
python:3.7-alpine
,我刚刚能够安装
numpy
opencv-utils
。我需要做的唯一更改是将
g++
作为附加包添加到Dockerfile中的apk命令中

RUN apk --no-cache add g++ ${ADDITIONAL_PACKAGE}
希望这有帮助

你可以用这个

它是带有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

我发现这篇文章在处理这个问题时非常有用。以下是它的摘录:

。。。标准Linux控制盘在Alpine Linux上不起作用

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

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

这也意味着您需要找出每个系统库 依赖你自己

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

这篇文章对我调试这个问题很有帮助。我希望这也是给你的

通过以下方式解决:

pip3安装--升级安装工具pip

pip3安装opencv python


source>

它现在更新为python 3.9。如果您想在2021年1月之前将其与Tensorflow一起使用,则不太好。
docker run -it jjanzic/docker-python3-opencv python
>>> import cv2