在 Docker Alpine 上安装 numpy
Installing numpy on Docker Alpine
我正在尝试在基于 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
给出同样的错误。
我是否遗漏了 config/installation 个步骤?
如果您不需要从 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
我自己在这方面遇到了一些麻烦,长话短说,我鼓励你问问这是否真的值得麻烦。当你开始向堆栈添加东西时,Numpy 是巨大的,比如 pandas、gpus 和 scipy,所以在 alpine 上构建它的好处是有限的,比使用 Debian、Arch 甚至 [=22] =] 无论如何,当您的 space 的 500MB 在此库中时,相对适中。
话虽如此,我拼凑了一张可以做到这一点的图片。我需要 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/
查看图像
试试这个:
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
根据我的 docker images
:
这个大约是 311MB
FROM python:3.6-alpine
RUN apk add g++
RUN pip install numpy
(同时 python:3.6
本身约为 900MB)
您试过不安装 gcc 吗?可能会冲突?不确定。这个作为最小的 numpy 安装对我有用,想分享。
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/lib
中 site-packages
的路径来解决:
FROM python:3.8-alpine
RUN apk add --update --no-cache py3-numpy
ENV PYTHONPATH=/usr/lib/python3.8/site-packages
通过优化,例如在构建后删除构建依赖项和删除不需要的测试(它们在这里是因为我们正在构建模块,而不仅仅是安装它):
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。
只需使用预装了 numpy 的 docker 图像:https://hub.docker.com/r/adreeve/python-numpy/
Alpine 使用 musl 构建,与 python 车轮不兼容。这意味着要么所有依赖项都应该通过 apk 安装,要么应该手动编译。为了使用 python pypi 依赖项获得更流畅的体验,使用 debian 看起来更优化,裁剪到最小尺寸(python:slim)作为起点:
FROM python:slim
CMD pip install numpy
123Mb
这种方法比接受的答案简单得多,而且生成的图像比其他答案更紧凑。
我正在尝试在基于 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
给出同样的错误。
我是否遗漏了 config/installation 个步骤?
如果您不需要从 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
我自己在这方面遇到了一些麻烦,长话短说,我鼓励你问问这是否真的值得麻烦。当你开始向堆栈添加东西时,Numpy 是巨大的,比如 pandas、gpus 和 scipy,所以在 alpine 上构建它的好处是有限的,比使用 Debian、Arch 甚至 [=22] =] 无论如何,当您的 space 的 500MB 在此库中时,相对适中。
话虽如此,我拼凑了一张可以做到这一点的图片。我需要 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/
查看图像试试这个:
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
根据我的 docker images
:
FROM python:3.6-alpine
RUN apk add g++
RUN pip install numpy
(同时 python:3.6
本身约为 900MB)
您试过不安装 gcc 吗?可能会冲突?不确定。这个作为最小的 numpy 安装对我有用,想分享。
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/lib
中 site-packages
的路径来解决:
FROM python:3.8-alpine
RUN apk add --update --no-cache py3-numpy
ENV PYTHONPATH=/usr/lib/python3.8/site-packages
通过优化,例如在构建后删除构建依赖项和删除不需要的测试(它们在这里是因为我们正在构建模块,而不仅仅是安装它):
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。
只需使用预装了 numpy 的 docker 图像:https://hub.docker.com/r/adreeve/python-numpy/
Alpine 使用 musl 构建,与 python 车轮不兼容。这意味着要么所有依赖项都应该通过 apk 安装,要么应该手动编译。为了使用 python pypi 依赖项获得更流畅的体验,使用 debian 看起来更优化,裁剪到最小尺寸(python:slim)作为起点:
FROM python:slim
CMD pip install numpy
123Mb
这种方法比接受的答案简单得多,而且生成的图像比其他答案更紧凑。