← Назад ко всем вопросам

Зачем нужен multi-stage build

1️⃣ Как кратко ответить

Multi-stage build в Docker позволяет создавать более легкие и оптимизированные образы, разделяя процесс сборки на несколько этапов. Это позволяет использовать разные базовые образы для различных стадий сборки, удалять ненужные зависимости и файлы после завершения сборки, что уменьшает размер конечного образа и повышает безопасность.

2️⃣ Подробное объяснение темы

Multi-stage build — это методология, используемая в Docker для создания контейнеров, которая позволяет разделить процесс сборки на несколько этапов. Каждый этап может использовать свой собственный базовый образ, что позволяет оптимизировать процесс сборки и уменьшить размер конечного Docker-образа.

Зачем это нужно

  1. Уменьшение размера образа: В процессе сборки приложения часто используются различные инструменты и зависимости, которые не нужны в конечном образе. Multi-stage build позволяет удалить эти ненужные компоненты, оставив только необходимые для работы приложения файлы.

  2. Повышение безопасности: Уменьшение количества компонентов в конечном образе снижает поверхность атаки, что делает контейнер более безопасным.

  3. Упрощение управления зависимостями: Разделение процесса сборки на этапы позволяет использовать разные наборы зависимостей на каждом этапе, что упрощает управление ими.

Как это работает

Multi-stage build позволяет использовать несколько FROM инструкций в одном Dockerfile. Каждый FROM начинает новый этап сборки. На каждом этапе можно копировать артефакты из предыдущих этапов, используя директиву COPY --from.

Пример

Рассмотрим пример Dockerfile, который использует multi-stage build для сборки и запуска простого Go-приложения.

# Первый этап: сборка приложения
FROM golang:1.17 AS builder
​
# Устанавливаем рабочую директорию
WORKDIR /app
​
# Копируем файлы проекта в контейнер
COPY . .
​
# Сборка приложения
RUN go build -o myapp
​
​
# Второй этап: создание минимального образа для запуска
FROM alpine:latest
​
# Устанавливаем рабочую директорию
WORKDIR /app
​
# Копируем скомпилированное приложение из предыдущего этапа
COPY --from=builder /app/myapp .
​
# Указываем команду для запуска приложения
CMD ["./myapp"]

Пояснение к коду

  • Первый этап (FROM golang:1.17 AS builder): Используется официальный образ Go для сборки приложения. Мы устанавливаем рабочую директорию /app, копируем все файлы проекта в контейнер и выполняем команду go build, чтобы скомпилировать приложение. Этот этап называется builder.

  • Второй этап (FROM alpine:latest): Используется минимальный образ Alpine Linux для создания легкого контейнера. Мы устанавливаем рабочую директорию /app и копируем скомпилированное приложение из предыдущего этапа (builder) в текущий контейнер. Команда CMD указывает, что приложение будет запущено при старте контейнера.

Применение

Multi-stage build широко используется в разработке и деплое контейнеризированных приложений, особенно в микросервисной архитектуре, где важны размер и безопасность контейнеров. Это позволяет разработчикам создавать более эффективные и безопасные образы, что особенно важно в производственных средах.

Тема: Docker и контейнеры
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки