Сталкивался с Multi-stage builds, когда в образе два раза есть FROM

«Сталкивался с Multi-stage builds, когда в образе два раза есть FROM» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, активно использую multi-stage сборки в Docker. Это ключевой паттерн для создания минимальных и безопасных образов. Первая стадия (часто на базе полноценного образа с компилятором) используется для сборки приложения, а вторая, финальная стадия (например, alpine или scratch), — только для запуска.

Пример для Go-приложения:

# Стадия сборки
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /myapp ./cmd/app

# Финальная стадия
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /
COPY --from=builder /myapp .
USER 1000:1000
CMD ["./myapp"]

Преимущества:

  • Размер: Финальный образ не содержит компилятора, исходного кода и промежуточных артефактов.
  • Безопасность: Уменьшается поверхность для атаки.
  • Четкое разделение: Сборка и рантайм логически разделены. Можно использовать COPY --from для копирования артефактов из любой предыдущей стадии.