我想构建一个具有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"]
答案 0 :(得分:4)
我也刚遇到这个问题。事实证明,这是行不通的,因为opencv-python
没有用于Alpine(您用作基础docker映像的发行版)的任何预建轮子。
opencv-python
软件包中this发行版中的对话详细解释了为什么会发生这种情况。 TL; DR是:如果您确实需要使用Alpine,则可以尝试opencv-python
的manylinux轮中的forcing the installation,但这可能会失败。如果您需要保留Alpine,最好的选择是从源代码构建模块。由于您是在OpenFAAS上运行此程序,因此我怀疑您希望保持较小的尺寸,因此从源代码进行构建可能对您来说是个不错的选择。
如果您不喜欢Alpine,我建议您转移到其他基础docker映像。如果您不确定要使用哪个映像作为基础映像,我建议使用python:3.7-slim
,因为它已经安装了Python(用3.7
替代您正在使用的任何版本,但实际上是……)。 3.7很好)。使用此容器,您只需运行pip install opencv-python numpy scipy
即可安装所有三个所需的软件包。您的Dockerfile的其余部分应该大部分未经修改即可工作;您只需要使用curl
而不是apt
来安装/卸载apk
。
答案 1 :(得分:4)
我发现本文Using Alpine can make Python Docker builds 50x slower在处理此问题时非常有帮助。这是摘录:
...标准Linux轮子在Alpine Linux上不起作用。
为什么?大多数Linux发行版使用GNU版本(glibc)的 每个C程序几乎都需要的标准C库, 包括Python。但是Alpine Linux使用Musl,那些二进制轮子是 针对glibc进行了编译,因此Alpine禁用了Linux wheel 支持。
如今,大多数Python软件包都包括PyPI上的二进制轮子, 大大加快了安装时间。但是,如果您使用的是Alpine Linux 您需要在每个Python包中编译所有C代码 使用。
这还意味着您需要弄清楚每个系统库 自己依赖。
希望这会增加来自rnorris的评论/建议,以使用其他基本图像(如果您未与Alpine结婚)。
本文对调试此问题非常有帮助。希望对您也一样!
答案 2 :(得分:1)
我遇到了同样的问题,但是由于需要一个ARMv7映像而更加复杂(因为该映像应该在Raspberry Pi上运行)。我在这里alpine-opencv-docker整理了一个Dockerfile和一个预构建的OpenCV安装。
或者,您也可以在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 VM中编译以上代码来整理软件包,然后从容器中拉出以下路径:
然后,我可以通过Dockerfile中的常规ADD
命令将它们添加回去,因此现在每个想要启动容器的人都可以在几秒钟内完成操作,而无需花费几天的时间。
答案 3 :(得分:1)
使用python:3.7-alpine
,我能够同时安装numpy
和opencv-utils
。我要做的唯一更改是将g++
作为附加软件包添加到Dockerfile中的apk命令中
RUN apk --no-cache add g++ ${ADDITIONAL_PACKAGE}
希望这会有所帮助!
答案 4 :(得分:0)
如果您正在进行机器学习,也许您可以使用张量流图像作为基础:
FROM tensorflow/tensorflow:nightly-py3
在这种情况下,pip3 install opencv-python
可以正常工作。
答案 5 :(得分:0)
您可以使用此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
。
答案 6 :(得分:0)
解决方法:
pip3 install --upgrade setuptools pip
pip3 安装 opencv-python
来源> https://github.com/3b1b/manim/issues/1213#issuecomment-703272203
答案 7 :(得分:-1)
实际上,您不应该使用pip安装open-cv,而必须使用OpenCV软件包进行安装。如果您使用的是Windows:
,然后转到 / 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__)
如果正确执行所有操作,则不会显示任何错误