Как използвате многослойната (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 и изходния код.
Това значително намалява размера на образа в сравнение с традиционния подход, при който компилацията и изпълнението се случват в един контейнер.