В первом примере вы запускаете
RUN git clone https://github.com/tfcbertaglia/enelvo.git enelvo-src \
... \
&& rm -fr enelvo-src
, поэтому дерево enelvo-src
никогда не существует вне этой конкретной инструкции RUN
; он удаляется до того, как Docker сможет создать из него слой.
Во втором примере вы запускаете
COPY --from=cloner /enelvo-src /app/enelvo-src
RUN rm -fr enelvo-src
Docker внутренне создает слой изображения после первого шага, который содержит содержимое этого исходного дерева. Последующий RUN rm
на самом деле не делает изображение меньше, он просто записывает, что контент, который был там с более раннего уровня, технически больше не является частью файловой системы.
Обычно стандартный способ использования многоэтапная сборка - это максимально возможное количество сборок на ранней стадии, и только COPY
конечный результат в образе времени выполнения. Для пакетов Python один подход, который может хорошо работать, состоит в создании колеса из пакета:
FROM python:3.7.6-slim-stretch as build
WORKDIR /build
RUN apt-get update && apt-get install -y git \
&& git clone https://github.com/tfcbertaglia/enelvo.git enelvo-src
&& ...
&& python setup.py bdist_wheel # (not "install")
FROM python:3.7.6-slim-stretch
WORKDIR /app
COPY --from=build /build/dist/wheel/enelvo*.whl .
RUN pip install enelvo*.whl
...