如何使用多阶段构建减小 python (docker) 图像大小?

新手上路,请多包涵

我正在寻找一种使用 python 和 Dockerfile 创建多阶段构建的方法:

例如,使用以下图像:

第一张图片:安装所有编译时要求,并安装所有需要的 python 模块

第二张图片:将所有编译/构建的包从第一张图片复制到第二张图片,没有编译器本身(gcc、postgers-dev、python-dev 等)

最终目标是拥有一个较小的图像,运行 python 和我需要的 python 包。

简而言之: 我如何“包装”在第一个图像中创建的所有已编译模块(站点包/外部库),并 以“干净”的方式将它们复制 到第二个图像。

原文由 gCoh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 639
2 个回答

好的,所以我的解决方案是使用 wheel,它允许我们在第一个图像上编译,为所有依赖项创建 wheel 文件并将它们安装在第二个图像中,而无需安装编译器

FROM python:2.7-alpine as base

RUN mkdir /svc
COPY . /svc
WORKDIR /svc

RUN apk add --update \
    postgresql-dev \
    gcc \
    musl-dev \
    linux-headers

RUN pip install wheel && pip wheel . --wheel-dir=/svc/wheels

FROM python:2.7-alpine

COPY --from=base /svc /svc

WORKDIR /svc

RUN pip install --no-index --find-links=/svc/wheels -r requirements.txt

您可以在以下博客文章中看到我对此的回答

https://www.blogfoobar.com/post/2018/02/10/python-and-docker-multistage-build

原文由 gCoh 发布,翻译遵循 CC BY-SA 4.0 许可协议

我推荐 本文(第 2 节)中详述的方法。他使用 virtualenv,因此 pip install 将所有 python 代码、二进制文件等存储在一个文件夹下,而不是分散在整个文件系统中。然后很容易将那个文件夹复制到最终的“生产”图像。总之:

编译镜像

  • 在您选择的某个路径中激活 virtualenv。
  • 将该路径添加到您的 docker ENV 中。这是所有 virtualenv 需要为所有未来的 docker RUN 和 CMD 操作运行的功能。
  • 像往常一样安装系统开发包和 pip install xyz

生产形象

  • 从 Compile Image 复制 virtualenv 文件夹。
  • 将 virtualenv 文件夹添加到 docker 的 PATH

原文由 mpoisot 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题