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

Что такое multi-stage build

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

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

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

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

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

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

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

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

Пример

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

# Первый этап: сборка приложения
FROM golang:1.19 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.19 AS builder): Используется официальный образ Go для сборки приложения.

    • WORKDIR /app: Устанавливает рабочую директорию.
    • COPY go.mod go.sum ./: Копирует файлы зависимостей.
    • RUN go mod download: Устанавливает зависимости.
    • COPY . .: Копирует весь исходный код.
    • RUN go build -o myapp: Собирает приложение в исполняемый файл myapp.
  • Второй этап (FROM alpine:latest): Используется минимальный образ Alpine для создания легковесного контейнера.

    • WORKDIR /root/: Устанавливает рабочую директорию.
    • COPY --from=builder /app/myapp .: Копирует скомпилированное приложение из первого этапа.
    • CMD ["./myapp"]: Указывает команду для запуска приложения.

Применение

Multi-stage build широко используется в разработке для создания производственных контейнеров, где важны размер и безопасность. Это особенно полезно для языков, требующих компиляции, таких как Go, C++, и Java, где процесс сборки может быть сложным и требовать множества инструментов и библиотек, которые не нужны в конечном образе.

Тема: Инфраструктура
Стадия: Tech

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

Твои заметки