【问题标题】:How to reduce final docker image size containing numpy, scipy, and scikit-learn如何减少包含 numpy、scipy 和 scikit-learn 的最终 docker 映像大小
【发布时间】:2020-05-03 15:11:38
【问题描述】:

我已经在 docker hub 上发布了这个问题,但我不确定哪个社区会对我的问题有更多的回应。我是创建 docker 映像的新手,并且已经整理了一个 Dockerfile,该 Dockerfile 创建了一个可以工作但最终映像大小为 600MB+ 的映像,并且希望有人比我更先进,如果我能做些什么来减少这种情况。我已经阅读了许多关于这样做的各种策略的博客,并且已经走上了 Python 虚拟环境路线。我真的很担心构建时间,因为我不会经常构建,但希望看到最终图像大小比实际尺寸更小。

我正在做的是使用 python 应用程序构建一个图像,fava 是会计程序 beancount 的 web gui 前端。仅这两个 python 应用程序就足够简单了,fava 团队甚至提供了一个基于 alpine 的 Dockerfile 来构建轻图像。但是,我遇到的问题是我想通过扩展这个 python 应用程序 (smart_importer) 来扩展它,它提供了一些机器学习功能,可以自动化交易导入过程的各个方面。这个扩展依赖于 numpy、scipy 和 scikit-learn,这就是额外权重的来源。我最初试图扩展 fava 团队的 alpine 方法,但是在 alpine 上安装 scipy 失败了,我无法解决。使用 python slim,我可以只用 fava 和 beancount 构建一个相当小的(

这是我目前拥有的 Dockerfile,是否可以轻松进行任何更改以减小我没有看到的最终图像大小?非常感谢任何人可能提出的建议。

FROM python:slim AS base

FROM base as builder

RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

#WORKDIR /install
COPY ./library-dependencies.txt /tmp/library-dependencies.txt
COPY ./requirements.txt /tmp/requirements.txt
#ENV PATH="/install:${PATH}"

RUN buildDeps='build-essential gcc gfortran python3-dev' \
    && apt-get update \
    && apt-get install -y $buildDeps --no-install-recommends \
    && cat /tmp/library-dependencies.txt | egrep -v "^\s*(#|$)" | xargs apt-get install -y \
    && pip3 install --upgrade pip \
    && CFLAGS="-g0 -Wl,--strip-all -I/usr/include:/usr/local/include -L/usr/lib:/usr/local/lib" \
        pip3 install \
#       --prefix="/install" \
        --no-cache-dir \
        --compile \
        --global-option=build_ext \
        --global-option="-j 6" \
        -r /tmp/requirements.txt \
    && apt-get purge -y --auto-remove $buildDeps \
    && rm -rf /var/lib/apt/lists/* \
    && rm -r \
    /tmp/requirements.txt \
        /tmp/library-dependencies.txt

FROM base
COPY --from=builder /opt/venv /opt/venv
COPY ./library-dependencies.txt /tmp/library-dependencies.txt

RUN apt-get update \
    && cat /tmp/library-dependencies.txt | egrep -v "^\s*(#|$)" | xargs apt-get install -y \
    && apt-get install -y libgomp1 --no-install-recommends \
    && rm -rf /var/lib/apt/lists/*

ENV PATH="/opt/venv/bin:$PATH"
ENV BEANCOUNT_FILE ""
ENV FAVA_OPTIONS ""
EXPOSE 5000
CMD fava --host 0.0.0.0 $FAVA_OPTIONS $BEANCOUNT_FILE

requirements.txt

# numeric packages needed for smart_importer
Cython==0.28.5
numpy==1.15.1
scipy==1.1.0
scikit-learn

#fava
fava
smart_importer

库依赖.txt

libopenblas-dev
liblapack-dev

libxml2-dev
libxslt1-dev
zlib1g-dev

【问题讨论】:

  • 您是否尝试过docker run --rm imagename du -k / 或类似的命令来查看空间被占用的位置?
  • @DavidMaze 发布的命令非常有用,查看该命令的输出,我能够将大小缩减到 421mb,其中几乎一半是我已安装和需要的 python 包,另外 60mb是 python 之外的包,其余的是 ~120mb。如果不采取激烈的措施,我看不到更多可以削减的内容。

标签: python numpy docker scikit-learn scipy


【解决方案1】:

用 apk 安装 py3-scipy 包有用吗?

【讨论】:

    【解决方案2】:

    我会推荐在 Alpine Linux 上使用 Python。您所做的任何 Dockerfile 更改都不会使您的图像几乎像 Alpine 一样小。

    这看起来是一个好的开始:https://github.com/jfloff/alpine-python

    【讨论】:

    • Alpine 不是一个很好的基础镜像,即使它会导致图像稍微小一些。缺少二元轮意味着更多的编译,因此构建速度较慢。不同的 libc 有时会导致细微的错误。更长的版本:pythonspeed.com/articles/base-image-python-docker-images
    • 来自那篇文章:Most of these problems have already been fixed。此外,如果安装包的构建时间太长,您可以构建一个新的基础映像并从那里开始 - 还有多阶段构建可以提供帮助。不是说这是一个有争议的问题,但这不是一个交易破坏者,IMO
    • 我过去曾尝试在 Alpine 上进行构建,但在安装 scipy 时非常头疼,最终放弃了这条路线。我同意使用 Alpine 的图像大小可能会导致图像更小,但无法获得所需的包来编译和安装它不是一个选项。为了完整性,我会给你链接的图像一个尝试。如前所述,我不关心图像构建时间,而是对减小最终图像大小更感兴趣。感谢您的建议。
    • 尝试了链接的基于 alpine 的图像,但没有运气使用它作为基础图像构建 scipy。当我第一次尝试使用 Alpine 作为他的基础镜像时,我遇到了同样的问题。链接的 git 还提到了使用此图像作为基础的项目,包括声称与其他数据科学家工具一起安装的 numpy、scipy 和 scikit-learn 的项目......此图像无法为相同构建原因。
    猜你喜欢
    • 1970-01-01
    • 2019-04-15
    • 2020-12-27
    • 1970-01-01
    • 2016-08-18
    • 2012-11-02
    • 2011-08-30
    • 2021-12-04
    • 2018-12-21
    相关资源
    最近更新 更多