【问题标题】:Docker multi-stage build for flask application用于烧瓶应用程序的 Docker 多阶段构建
【发布时间】:2019-07-26 19:47:03
【问题描述】:

我想 dockerize flask 有很多依赖项的应用程序。我的目标是减小最终 docker 镜像的大小。

我尝试了多阶段构建,但它并没有减少最终 docker 映像的大小。

下面是我的Dockerfile

FROM python:3.6-slim-buster as base

RUN apt-get update && apt-get install --no-install-recommends --no-upgrade -y \
    libglib2.0-0 libxext6 libsm6 libxrender1 libfontconfig1 && rm -rf /var/lib/apt/lists/*


WORKDIR /wheels

COPY requirements.txt /wheels

RUN pip install -U pip \
   && pip wheel -r requirements.txt



FROM python:3.6-slim-buster

COPY --from=base /wheels /wheels


RUN pip install -U pip \
       && pip install -r /wheels/requirements.txt \
                      -f /wheels \
       && rm -rf /wheels \
       && rm -rf /root/.cache/pip/* 

...

最后一个pip install... 命令占用905MB

我应该如何将所有需求从最终镜像中分离出来并减小最终docker镜像的整体大小?

【问题讨论】:

  • 是否所有需求及其依赖项都从轮文件安装?
  • @Klaus D. 是的。

标签: python docker docker-multi-stage-build


【解决方案1】:

在最终的 RUN 中删除 /wheels 不会使您的图像更小 - 这些文件仍然在最终图像构建的上一层中。一旦你复制了一些东西,它就会出现在你的图像中。

我建议将代码安装到构建映像中的 virtualenv 中(尽管您也可以执行 --user install)并将 virtualenv 复制到运行时映像中。

FROM python:3.7-slim AS compile-image
RUN apt-get update
RUN apt-get install -y --no-install-recommends build-essential gcc

RUN python -m venv /opt/venv
# Make sure we use the virtualenv:
ENV PATH="/opt/venv/bin:$PATH"

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY setup.py .
COPY myapp/ .
RUN pip install .

FROM python:3.7-slim AS build-image
COPY --from=compile-image /opt/venv /opt/venv

# Make sure we use the virtualenv:
ENV PATH="/opt/venv/bin:$PATH"
CMD ['myapp']

更多解释请看这里:https://pythonspeed.com/articles/multi-stage-docker-python/

【讨论】:

  • 我的应用程序需要一些可以使用apt-get 安装的库,并且它没有安装在虚拟环境中。有没有办法做到这一点?
  • 您也可以在第二张图片中使用apt-get install,如果您愿意,可以使用与第一张图片不同的软件包列表。 virtulenv 是一种使复制文件更容易的方法,仅此而已。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 2021-07-26
  • 2021-05-20
  • 1970-01-01
相关资源
最近更新 更多