cjn*_*ash 9 python opencv docker
我想构建一个具有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
我在网上阅读的每件事都说a 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"]
Run Code Online (Sandbox Code Playgroud)
rno*_*ris 10
我也刚遇到这个问题。事实证明,这是行不通的,因为opencv-python没有用于Alpine(您正在用作基本docker映像的发行版)的任何预制轮子。
在交谈中这对这个问题opencv-python包解释了为什么这种情况发生在更多的细节。TL; DR是:如果您确实需要使用Alpine,则可以尝试强制安装 manylinux轮opencv-python,但这可能会中断。如果您需要保留Alpine,最好的选择是从源代码构建模块。由于您是在OpenFAAS上运行此程序,因此我怀疑您希望保持较小的尺寸,因此从源代码进行构建可能对您来说是一个不错的选择。
如果您不喜欢Alpine,我建议您转移到其他基础docker映像。如果您不确定要使用哪个映像作为基础,我会建议您使用python:3.7-slim,因为它将随已安装的Python一起安装(用3.7您使用的任何版本代替,但3.7确实不错)。使用此容器,您可以简单地运行pip install opencv-python numpy scipy以安装所有三个所需的软件包。您的Dockerfile的其余部分应该大部分未经修改即可工作;您只需要curl使用apt而不是进行安装/卸载apk。
我遇到了同样的问题,但由于需要 ARMv7 映像而变得更加复杂(因为它应该在 Raspberry Pi 上运行)。我在此处汇总了 Dockerfile 和预构建的 OpenCV 安装:alpine-opencv-docker。
或者,您可以在 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
Run Code Online (Sandbox Code Playgroud)
我通过在一个巨大的 EC2 虚拟机中编译上述内容来将我的包放在一起,然后从容器中拉出以下路径:
然后我可以通过ADD我的 Dockerfile 中的普通命令将它们添加回来,所以现在每个想要启动容器的人都可以在几秒钟而不是几天内完成。
小智 5
我发现这篇文章Using Alpine can make Python Docker builds 50x slow,在处理这个问题时非常有帮助。这是它的摘录:
...标准的 Linux 轮子在 Alpine Linux 上不起作用。
为什么?大多数 Linux 发行版使用标准 C 库的 GNU 版本 (glibc),几乎每个 C 程序都需要它,包括 Python。但是 Alpine Linux 使用 musl,这些二进制轮是针对 glibc 编译的,因此 Alpine 禁用了 Linux 轮支持。
现在大多数 Python 包都包含 PyPI 上的二进制轮子,显着加快了安装时间。但是,如果您使用的是 Alpine Linux,则需要编译您使用的每个 Python 包中的所有 C 代码。
这也意味着您需要自己弄清楚每个系统库依赖项。
希望这会增加rnorris的评论/建议,以使用不同的基本图像(如果您未与 Alpine 结婚)。
这篇文章对我调试这个问题非常有帮助。我希望它也适合你!
| 归档时间: |
|
| 查看次数: |
4115 次 |
| 最近记录: |