Ответ
Да, активно использую 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для копирования артефактов из любой предыдущей стадии.