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

Как работает multi-stage сборка в Docker

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

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

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

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

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

  1. Оптимизация размера образа: Уменьшение размера образа приводит к более быстрому развертыванию и меньшему потреблению ресурсов.
  2. Улучшение безопасности: Исключение инструментов сборки и ненужных библиотек снижает поверхность атаки.
  3. Упрощение управления зависимостями: Разделение на этапы позволяет четко управлять зависимостями и инструментами, необходимыми для каждого этапа.

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

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
​
&#8203;
# Второй этап: создание минимального образа
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 для создания контейнеров, которые:

  • Быстро загружаются и развертываются.
  • Содержат только необходимые для работы приложения файлы.
  • Обеспечивают более безопасное окружение за счет исключения инструментов сборки и ненужных библиотек.

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

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

Твои заметки