Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 最小SciPy Dockerfile_Python_Docker_Scipy_Dockerfile_Alpine - Fatal编程技术网

Python 最小SciPy Dockerfile

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,如下所示:

我有一个Dockerfile,如下所示,应用程序代码被省略:

来自python:3的

#二进制依赖项
运行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的轮子文件,所以您可能需要编译它们。一般来说,最好使用更具体的标记,因为
      python:3-slim
      标记将在不同的时间点指向不同版本的python
  • 您还可以省略
    gfortran
    libopenblas dev
    liblapack dev
    的安装。这些软件包对于构建numpy/scipy是必需的,但是如果安装了预编译的wheel文件,则不需要编译任何代码
  • 使用
    pip install
    中的
    --no cache dir
    禁用缓存。如果不包括此项,则pip的缓存将计入Docker映像大小
  • mysqlclient的
    没有linux控制盘,因此您必须编译它。您可以在一条
    运行
    指令中安装生成依赖项,安装软件包,然后删除生成依赖项。请记住,
    libmariadb3
    是此包的运行时依赖项
  • 下面是实现上述建议的Dockerfile。它使Docker映像的大小达到354MB

    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的轮子文件,所以您可能需要编译它们。一般来说,最好使用更具体的标记,因为
      python:3-slim
      标记将在不同的时间点指向不同版本的python
  • 您还可以省略
    gfortran
    libopenblas dev
    liblapack dev
    的安装。这些软件包对于构建numpy/scipy是必需的,但是如果安装了预编译的wheel文件,则不需要编译任何代码
  • 使用
    pip install
    中的
    --no cache dir
    禁用缓存。如果不包括此项,则pip的缓存将计入Docker映像大小
  • mysqlclient的
    没有linux控制盘,因此您必须编译它。您可以在一条
    运行
    指令中安装生成依赖项,安装软件包,然后删除生成依赖项。请记住,
    libmariadb3
    是此包的运行时依赖项
  • 下面是实现上述建议的Dockerfile。它使Docker映像的大小达到354MB

    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