Проверяет понимание multi-stage build в Docker и его преимуществ для оптимизации образов.
Multi-stage build — это возможность Dockerfile использовать несколько инструкций FROM. Каждая инструкция начинает новую стадию сборки, которая может иметь собственный базовый образ и набор команд. Это решает проблему раздувания образов, когда для сборки нужны компиляторы и зависимости, но в рантайме они не требуются.
Без multi-stage build разработчики часто использовали один образ, содержащий и инструменты сборки, и рантайм-зависимости. Это приводило к огромным размерам образов и увеличению поверхности атаки. Multi-stage build позволяет разделить процесс: одна стадия собирает приложение, другая — создает минимальный образ с только необходимыми файлами.
# Стадия сборки
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# Финальная стадия
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]В этом примере первая стадия использует образ Go для компиляции, вторая — легковесный Alpine, куда копируется только скомпилированный бинарник. Итоговый образ не содержит исходников и компилятора.
Multi-stage build широко используется в CI/CD пайплайнах для оптимизации доставки приложений. Он особенно полезен для языков с компиляцией (Go, Rust, Java) и для проектов, где нужны специфические инструменты сборки (например, Node.js с npm).
Вывод: Используйте multi-stage build, когда хотите уменьшить размер Docker-образа, повысить безопасность и ускорить развертывание. Это стандартная практика для production-сборок.