Python 最小SciPy Dockerfile
我有一个Dockerfile,如下所示,应用程序代码被省略: 来自python:3的Python 最小SciPy Dockerfile,python,docker,scipy,dockerfile,alpine,Python,Docker,Scipy,Dockerfile,Alpine,我有一个Dockerfile,如下所示,应用程序代码被省略: 来自python:3的 #二进制依赖项 运行apt更新和apt安装-y gfortran libopenblas dev liblapack dev #需要Python软件包 运行python3-mpipinstallmysqlclient numpy-scipy-matplotlib 它工作正常,但生成的图像大小为1.75 GB(而代码约为50 MB)。我怎样才能减少这么大的体积 我还尝试使用Alpine Linux,如下所示:
#二进制依赖项
运行apt更新和apt安装-y gfortran libopenblas dev liblapack dev
#需要Python软件包
运行python3-mpipinstallmysqlclient numpy-scipy-matplotlib
它工作正常,但生成的图像大小为1.75 GB(而代码约为50 MB)。我怎样才能减少这么大的体积
我还尝试使用Alpine Linux,如下所示:
来自python的:3-1
#numpy和scipy的二进制依赖关系;尽管第二个也不行
运行apk add--无缓存--虚拟生成依赖项\
gfortran gcc g++libstdc++\
musl-dev-lapack-dev-freetype-dev-python3-dev
#对于mysqlclient
运行apk--无缓存添加mariadb dev
#需要Python软件包
运行python3-mpipinstallmysqlclient numpy-scipy-matplotlib
但是阿尔卑斯山导致了许多不同的奇怪错误。来自上层代码的错误:
File "scipy/odr/setup.py", line 28, in configuration
blas_info['define_macros'].extend(numpy_nodepr_api['define_macros'])
KeyError: 'define_macros'
那么,如何使用上述软件包获得尽可能小(或至少更小)的Python3图像呢?有几种方法可以使Docker图像更小
python:3-slim
Docker图像作为基础。-slim
图像不包括编译软件所需的软件包。
- 将Python版本固定到3.8。有些包还没有Python3.9的轮子文件,所以您可能需要编译它们。一般来说,最好使用更具体的标记,因为
标记将在不同的时间点指向不同版本的pythonpython:3-slim
gfortran
、libopenblas dev
和liblapack dev
的安装。这些软件包对于构建numpy/scipy是必需的,但是如果安装了预编译的wheel文件,则不需要编译任何代码pip install
中的--no cache dir
禁用缓存。如果不包括此项,则pip的缓存将计入Docker映像大小没有linux控制盘,因此您必须编译它。您可以在一条运行
指令中安装生成依赖项,安装软件包,然后删除生成依赖项。请记住,libmariadb3
是此包的运行时依赖项
FROM python:3.8-slim
# Install mysqlclient (must be compiled).
RUN apt-get update -qq \
&& apt-get install --no-install-recommends --yes \
build-essential \
default-libmysqlclient-dev \
# Necessary for mysqlclient runtime. Do not remove.
libmariadb3 \
&& rm -rf /var/lib/apt/lists/* \
&& python3 -m pip install --no-cache-dir mysqlclient \
&& apt-get autoremove --purge --yes \
build-essential \
default-libmysqlclient-dev
# Install packages that do not require compilation.
RUN python3 -m pip install --no-cache-dir \
numpy scipy pandas matplotlib
使用alpine linux是个好主意,但alpine使用muslc而不是glibc,因此它与大多数pip控制盘不兼容。结果是您必须编译numpy/scipy。您可以做一些事情来缩小Docker图像
python:3-slim
Docker图像作为基础。-slim
图像不包括编译软件所需的软件包。
- 将Python版本固定到3.8。有些包还没有Python3.9的轮子文件,所以您可能需要编译它们。一般来说,最好使用更具体的标记,因为
标记将在不同的时间点指向不同版本的pythonpython:3-slim
gfortran
、libopenblas dev
和liblapack dev
的安装。这些软件包对于构建numpy/scipy是必需的,但是如果安装了预编译的wheel文件,则不需要编译任何代码pip install
中的--no cache dir
禁用缓存。如果不包括此项,则pip的缓存将计入Docker映像大小没有linux控制盘,因此您必须编译它。您可以在一条运行
指令中安装生成依赖项,安装软件包,然后删除生成依赖项。请记住,libmariadb3
是此包的运行时依赖项
FROM python:3.8-slim
# Install mysqlclient (must be compiled).
RUN apt-get update -qq \
&& apt-get install --no-install-recommends --yes \
build-essential \
default-libmysqlclient-dev \
# Necessary for mysqlclient runtime. Do not remove.
libmariadb3 \
&& rm -rf /var/lib/apt/lists/* \
&& python3 -m pip install --no-cache-dir mysqlclient \
&& apt-get autoremove --purge --yes \
build-essential \
default-libmysqlclient-dev
# Install packages that do not require compilation.
RUN python3 -m pip install --no-cache-dir \
numpy scipy pandas matplotlib
使用alpine linux是个好主意,但alpine使用muslc而不是glibc,因此它与大多数pip控制盘不兼容。结果是您必须编译numpy/scipy。您确定吗?我刚才试过两次使用该映像,但是
pip install mysqlclient
导致OSError:mysql\u config not found
,而numpy导致RuntimeError:breaked toolchain:无法链接简单的C程序
似乎mysqlclient就是问题所在。我不认为numpy有这个问题。。。我不认为您在复制我的答案中的dockerfile。对,我使用了第一个版本的python:3-slim代码,并且包已成功安装在3.8版本上。除了mysqlclient
:(谢谢!您的最终Dockerfile运行良好,结果是480MB,比我的原始版本小3倍多嗨!您确定在安装python mysqlclient后删除系统的mysqlclient吗?它似乎工作正常:NameError:name'\u mysql'未定义
。查看更多信息。您确定吗?我尝试了两次使用该映像刚才,但是pip安装mysqlclient
导致了OSError:mysql\u config not found
,而numpy导致了RuntimeError:breaked toolchain:cannotlink a simple C program
似乎是mysqlclient的问题。我看不出numpy的问题……我不认为你在我的回答中复制了dockerfile。对,我使用了fi使用python:3-slim
的代码的rst版本,并且包已成功安装在3.8版本上。除了mysqlclient
:(谢谢!您的最终Dockerfile运行良好,结果是480MB,比我的原始版本小3倍多。您好!您确定在安装python mysqlclient后删除系统的mysqlclient吗?它似乎工作正常:NameError:name'\u mysq