【问题标题】:Installing numpy on Docker Alpine在 Docker Alpine 上安装 numpy
【发布时间】:2016-01-30 01:13:49
【问题描述】:

我正在尝试在基于 Alpine 3.1 的 docker 容器中安装 numpy。我正在使用以下 Dockerfile:

FROM alpine:3.1
RUN apk add --update make cmake gcc g++ gfortran
RUN apk add --update python py-pip python-dev
RUN pip install cython
RUN pip install numpy

这运行良好,直到pip install numpy 出现以下错误:

error: Command "gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -Inumpy/core/include -Ibuild/src.linux-x86_64-2.7/numpy/core/include/numpy -Inumpy/core/src/private -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/usr/include/python2.7 -Ibuild/src.linux-x86_64-2.7/numpy/core/src/private -Ibuild/src.linux-x86_64-2.7/numpy/core/src/private -Ibuild/src.linux-x86_64-2.7/numpy/core/src/private -c build/src.linux-x86_64-2.7/numpy/core/src/npymath/ieee754.c -o build/temp.linux-x86_64-2.7/build/src.linux-x86_64-2.7/numpy/core/src/npymath/ieee754.o" failed with exit status 1

easy_install-2.7 numpy 给出同样的错误。

我是否缺少任何配置/安装步骤?

【问题讨论】:

    标签: python numpy docker pip alpine


    【解决方案1】:

    只需使用预装了 numpy 的 docker 镜像:https://hub.docker.com/r/adreeve/python-numpy/

    【讨论】:

      【解决方案2】:

      如果您不需要从 pypi 安装 numpy,您可以从 alpine 存储库安装它。包名为py-numpy,位于testing 存储库中,请参阅here。适合我的最小 Dockerfile 示例

      FROM alpine:3.2
      ADD repositories /etc/apk/repositories
      RUN apk add --update python python-dev gfortran py-pip build-base py-numpy@community
      

      repositories 文件的内容

      http://dl-cdn.alpinelinux.org/alpine/v3.2/main
      @community http://dl-cdn.alpinelinux.org/alpine/edge/community
      

      【讨论】:

      • 这是可行的,但不幸的是,这对于 python 2.7 来说是 numpy。我们需要 3.5 的版本
      • 作为更新,您需要在任何地方切换到 @community 而不是 @testing,例如py-numpy@community@community http://dl-cdn.alpinelinux.org/alpine/edge/community
      • 我已经尝试了这篇文章中的所有内容,包括下面的@James-Endicott 图片,并且安装总是围绕 NumPy 崩溃。还尝试了github.com/WattyAB/docker.alpine.numerical-python,但不幸的是没有用。将只使用 650MB 的图像..
      • 现在应该是py3。使用 lapack 的最小安装是 apk add python3-dev py3-numpy lapack,不需要其他软件包(自动提取 gfortran 依赖项)。
      • 但是为什么这是一个问题呢?即,为什么没有适合高山的 numpy 轮
      【解决方案3】:

      Alpine 存储库中现在提供了一个包:py3-numpy。但是你不能马上使用它。

      py3-numpy 将库安装到/usr/lib/python3.8/site-packages 目录但默认的 Python 模块路径不使用它:

      $ docker run -it python:3.8-alpine sh
      / # apk add --update --no-cache py3-numpy
      / # python
      >>> import numpy
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      ModuleNotFoundError: No module named 'numpy'
      >>> import sys
      >>> sys.path
      ['', '/usr/local/lib/python38.zip', '/usr/local/lib/python3.8', '/usr/local/lib/python3.8/lib-dynload', '/usr/local/lib/python3.8/site-packages']
      

      这可以通过将$PYTHONPATH 环境变量设置为/usr/libsite-packages 的路径来解决:

      FROM python:3.8-alpine
      
      RUN apk add --update --no-cache py3-numpy
      ENV PYTHONPATH=/usr/lib/python3.8/site-packages
      

      【讨论】:

      【解决方案4】:

      通过优化,例如在构建后删除构建依赖项和删除不需要的测试(它们在这里是因为我们正在构建模块,而不仅仅是安装它):

      FROM frolvlad/alpine-python3
      
      RUN apk add --no-cache \
              --virtual=.build-dependencies \
              g++ file binutils \
              musl-dev python3-dev cython && \
          apk add libstdc++ openblas && \
          ln -s locale.h /usr/include/xlocale.h && \
          pip install numpy && \
          rm -r /root/.cache && \
          find /usr/lib/python3.*/ -name 'tests' -exec rm -r '{}' + && \
          find /usr/lib/python3.*/site-packages/ -name '*.so' -print -exec sh -c 'file "{}" | grep -q "not stripped" && strip -s "{}"' \; && \
          rm /usr/include/xlocale.h && \
          apk del .build-dependencies
      
      

      结果大小 ~157MB。

      【讨论】:

      • 有趣!您能评论一下为什么需要xlocale.h 吗?我看到其他食谱要求例如gfortran 也是如此,我很好奇 authoritative 依赖集是什么。
      • @DimaTisnek,我实际上不记得为什么需要它。但是流程很简单:尝试构建尽可能小的可用映像,如果它没有构建,然后添加缺少的依赖项并重试。最后,我尽量不使用alpine,大多数时候slim版本就够了。
      • 好一个 :) gfortran 似乎只需要本地开发,运行测试。
      • xlocale 的参考:github.com/numpy/numpy/pull/8367
      【解决方案5】:

      根据我的docker images,这个大约311MB:

      FROM python:3.6-alpine
      RUN apk add g++ 
      RUN pip install numpy
      

      (同时 python:3.6 本身约为 900MB)

      你试过不安装 gcc 吗?可能是矛盾的?不确定。这个对我来说是一个最小的 numpy 安装,并希望分享。

      【讨论】:

        【解决方案6】:

        试试这个:

        RUN apk --no-cache --update-cache add gcc gfortran python python-dev py-pip build-base wget freetype-dev libpng-dev openblas-dev
        RUN ln -s /usr/include/locale.h /usr/include/xlocale.h
        RUN pip install pandas
        

        【讨论】:

          【解决方案7】:

          我自己在这方面遇到了一些麻烦,长话短说,我鼓励你问问这是否真的值得麻烦。当您开始向堆栈中添加诸如 pandas、gpus 和 scipy 之类的东西时,Numpy 是巨大的,因此在 alpine 上构建它的好处是有限的,当您的空间为 500MB 时,使用 Debian、Arch 甚至 Ubuntu 所节省的费用相对较少反正这个库。

          话虽如此,我还是拼凑了一张可以做到这一点的图像。我需要作为构建时依赖项 musl-dev、linux-headers 和 g++。我还需要从边缘添加 openblas 以在堆栈中稍后添加某些内容,因此可能也需要其中的一些依赖项。但我相信只需将三个以前的库添加到

          apk --no-cache add musl-dev linux-headers g++
          

          应该足以防止您遇到的 gcc 错误。您可以在https://hub.docker.com/r/o76923/alpine-numpy-stack/查看图片

          【讨论】:

          • 即使没有linux-headers,也可以在python:3-alpine 图像上为我工作。谢谢!
          • 我现在对这个问题的回答有点老了。社区边缘的py-numpy-dev 包现在似乎可以工作了。
          • 詹姆斯,你有没有确切的图像尺寸差异?
          • Debian / Arch / Ubuntu 方法的另一个优点是,这些发行版通常可以使用 PyPI 的预构建 manylinux 轮子,因此您很有可能不需要 构建时依赖项。
          猜你喜欢
          • 2016-11-28
          • 2016-06-11
          • 1970-01-01
          • 2020-11-29
          • 2018-07-13
          • 2019-07-20
          • 1970-01-01
          • 2020-10-17
          • 1970-01-01
          相关资源
          最近更新 更多