在Docker Alpine上安装numpy

hgqdbh6s  于 2023-08-03  发布在  Docker
关注(0)|答案(9)|浏览(180)

我尝试在基于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给出相同的错误。
我是否遗漏了任何配置/安装步骤?

kulphzqa

kulphzqa1#

我自己在这方面也遇到了一些麻烦,长话短说,我鼓励你问问这是否真的值得。Numpy是巨大的,当你开始添加东西到堆栈像Pandas,gpus和scipy,所以在alpine上构建它的好处是有限的,使用Debian,Arch甚至Ubuntu的节省是相对温和的,当500 MB的空间在这个库上时。
话虽如此,我把它放在一起的图像。我需要musl-dev、linux-headers和g++作为构建时依赖项。我还需要从edge添加openblas,以便在堆栈中稍后添加,因此可能也需要一些依赖项。但我相信只要加上三个以前的图书馆

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

字符串
应该足以防止你得到的gcc错误。您可以在https://hub.docker.com/r/o76923/alpine-numpy-stack/上查看图像

hzbexzde

hzbexzde2#

如果你不需要从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

gev0vcfq

gev0vcfq3#

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

uttx8gqw

uttx8gqw4#

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

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

字符串
(同时python:3.6本身约为900MB)
你有没有试过不安装gcc?可能会有冲突?不确定。这一个对我来说是一个最小的numpy安装,并希望分享。

ndh0cuux

ndh0cuux5#

Alpine是用musl构建的,它与python轮子不兼容。这意味着所有依赖项都应该通过apk安装,或者应该手动编译。为了更流畅地体验python pypi依赖项,使用debian,裁剪到最小大小(python:slim)作为起点看起来更理想:

FROM python:slim
CMD pip install numpy

字符串
123Mb
这种方法比公认的答案简单得多,所得图像比其他答案更紧凑。

kx7yvsdv

kx7yvsdv6#

试试这个:

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

字符串

y1aodyip

y1aodyip7#

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

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。

l3zydbqr

l3zydbqr8#

标准PyPI轮在Alpine上不工作

  • 为什么?大多数Linux发行版使用GNU版本(glibc)的

标准C库,几乎每个C程序都需要它,
包括Python。但是Alpine Linux使用musl,那些二进制wheel是针对glibc编译的,因此Alpine禁用了Linux wheel
支持。

  • 现在大多数Python包都包含PyPI上的二进制轮子,

大大加快了安装时间。但是如果你使用的是Alpine Linux,你需要编译每个Python包中的所有C代码。
得双曲余切值.

  • 找到了一个解决方案来使用这个:

运行apk --update add gcc libc-dev libffi-dev build-base freetype-dev libpng-dev openblas-dev
但是Alpine构建速度较慢,图像更大。

  • 此外,虽然理论上Alpine使用的musl C库与其他Linux发行版使用的glibc基本兼容,但实际上这些差异可能会导致问题。
  • 总而言之,最好使用python:slim而不是python:alpine,因为不值得麻烦 *

相关问题