Sobes.tech
Middle

В кои случаи се използва многостепенна (multi-stage) сборка?

sobes.tech AI

Отговор от AI

Мултистейдж (multi-stage build) в Docker се използва в следните случаи:

  1. Намаляване на размера на крайния образ: В първия (или междинен) слой на изграждане се намират инструментите, необходими за компилиране, тестове или други етапи на изграждане (например компилатор, зависимости за изграждане). Във втория (краен) слой се копират само артефактите, необходими за стартиране на приложението (компилиран код, изпълними файлове, библиотеки за време на изпълнение). Това предотвратява включването в крайния образ на ненужни зависимости и инструменти за изграждане, значително намалявайки неговия размер.
  2. Разделяне на етапите на изграждане и стартиране: Ясното разделяне улеснява разбирането на процеса на изграждане и отстраняването на грешки. Могат да се имат етапи за компилиране на изходния код, изпълнение на тестове, линтинг и след това създаване на финалния образ с готовото за внедряване приложение.
  3. Подобряване на сигурността: Финалният образ съдържа минимално необходимите компоненти, което намалява повърхността за атака. Инструментите за изграждане и изходният код, които могат да съдържат уязвимости, не се включват в образа, използван в продукцията.
  4. Ускоряване на изграждането (в някои случаи): Междинните образи могат да се кешират, и при промени само в последните етапи на изграждане не е необходимо да се изгражда всичко наново.
  5. Уеднаквяване на процеса на изграждане: Изграждането на приложението и създаването на неговия Docker образ стават един автоматизиран процес в рамките на един Dockerfile, което улеснява CI/CD пайплайни.

Пример за използване за приложение на Go:

# Етап на изграждане
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
# Компилиране на изпълнимия файл
RUN go build -ldflags="-s -w" -o myapp .

# Финален етап
FROM alpine:latest
WORKDIR /app
# Копиране само на изпълнимия файл от предишния етап
COPY --from=builder /app/myapp .
# Команда за стартиране на приложението
CMD ["./myapp"]