Как работает multi-stage сборка в Docker
1️⃣ Как кратко ответить
Multi-stage сборка в Docker позволяет создавать более легкие и оптимизированные образы, разделяя процесс сборки на несколько этапов. Каждый этап может использовать разные базовые образы, и только необходимые артефакты переносятся в финальный образ. Это уменьшает размер конечного образа и улучшает безопасность, исключая ненужные зависимости и инструменты сборки.
2️⃣ Подробное объяснение темы
Multi-stage сборка в Docker — это методология, которая позволяет разбивать процесс создания Docker-образа на несколько этапов. Каждый этап может использовать свой собственный базовый образ и инструменты, необходимые для выполнения конкретной задачи. Основная цель — минимизировать размер конечного образа и улучшить его безопасность, исключая ненужные зависимости и инструменты, которые не требуются в рабочем окружении.
Зачем это нужно
- Оптимизация размера образа: Уменьшение размера образа приводит к более быстрому развертыванию и меньшему потреблению ресурсов.
- Улучшение безопасности: Исключение инструментов сборки и ненужных библиотек снижает поверхность атаки.
- Упрощение управления зависимостями: Разделение на этапы позволяет четко управлять зависимостями и инструментами, необходимыми для каждого этапа.
Как это работает
Multi-stage сборка позволяет использовать несколько FROM инструкций в одном Dockerfile. Каждый FROM начинает новый этап сборки. Вы можете копировать артефакты из одного этапа в другой, используя инструкцию COPY --from=<stage>.
Пример
Рассмотрим пример Dockerfile, который использует multi-stage сборку для создания Go-приложения:
# Первый этап: сборка приложения
FROM golang:1.17 AS builder
# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /app
# Копируем файлы go.mod и go.sum для установки зависимостей
COPY go.mod go.sum ./
# Устанавливаем зависимости
RUN go mod download
# Копируем исходный код приложения
COPY . .
# Собираем бинарный файл
RUN go build -o myapp
​
# Второй этап: создание минимального образа
FROM alpine:latest
# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /root/
# Копируем бинарный файл из предыдущего этапа
COPY --from=builder /app/myapp .
# Указываем команду для запуска приложения
CMD ["./myapp"]
Объяснение кода
-
Первый этап (
FROM golang:1.17 AS builder): Используется официальный образ Go для сборки приложения.WORKDIR /app: Устанавливает рабочую директорию.COPY go.mod go.sum ./: Копирует файлы зависимостей.RUN go mod download: Устанавливает зависимости.COPY . .: Копирует весь исходный код.RUN go build -o myapp: Собирает бинарный файл приложения.
-
Второй этап (
FROM alpine:latest): Используется минимальный образ Alpine для создания финального образа.WORKDIR /root/: Устанавливает рабочую директорию.COPY --from=builder /app/myapp .: Копирует собранный бинарный файл из первого этапа.CMD ["./myapp"]: Указывает команду для запуска приложения.
Применение
Multi-stage сборка широко используется в DevOps для создания контейнеров, которые:
- Быстро загружаются и развертываются.
- Содержат только необходимые для работы приложения файлы.
- Обеспечивают более безопасное окружение за счет исключения инструментов сборки и ненужных библиотек.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться