Sobes.tech
Middle

Чӣ гуна истифода мебаред сохтмони бисёрқадамӣ (multistage) барои оптимизатсияи тасвирҳои Docker?

sobes.tech AI

Ҷавоб аз AI

Багсатовий збір дозволяє використовувати кілька етапів (layers) у Dockerfile, де кожен етап виконує свою задачу. Результат одного етапу (наприклад, скомпільований артефакт) передається на наступний етап, але проміжні шари попередніх етапів не включаються до фінального образу.

Приклад використання для збірки Go-додатку:

# Етап збірки
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp

# Фінальний етап
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]

Переваги:

  • Зменшення розміру образу: У фінальному образі міститься лише зібраний додаток і необхідні залежності, а не інструменти збірки, вихідний код або проміжні файли.
  • Розділення відповідальностей: Логіка компіляції/розгортання відокремлена від логіки розгортання.
  • Підвищення безпеки: Зменшується поверхня атаки за рахунок виключення непотрібних інструментів і бібліотек із фінального образу.
  • Прискорення збірки: Кешування шарів між етапами може прискорити повторні збірки.

У наведеному Dockerfile перший шар builder використовується для компіляції Go-додатку. Другий шар, що починається з FROM alpine:latest, копіює лише скомпільований додаток із першого шару (COPY --from=builder /app/myapp /app/) у чистий базовий образ. В результаті фінальний образ містить лише виконуваний файл і базову операційну систему, без компілятора Go і вихідного коду.

Це суттєво зменшує розмір образу порівняно з традиційним підходом, коли збірка і виконання відбуваються у одному контейнері.