2

我想 dockerizeflask具有很多依赖项的应用程序。我的目标是减小最终 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 映像的整体大小?

4

1 回答 1

4

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

我建议将代码安装到构建映像中的 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/

于 2019-07-26T20:28:42.293 回答