Что такое multi-stage build
1️⃣ Как кратко ответить
Multi-stage build — это методика в Docker, позволяющая создавать контейнеры, используя несколько этапов сборки в одном Dockerfile. Это позволяет уменьшить размер конечного образа, исключая ненужные зависимости и файлы, которые использовались только на промежуточных этапах.
2️⃣ Подробное объяснение темы
Multi-stage build — это подход в Docker, который позволяет оптимизировать процесс сборки контейнеров, делая их более легковесными и эффективными. Основная идея заключается в использовании нескольких этапов сборки в одном Dockerfile, где каждый этап может использовать результаты предыдущих, но в конечный образ попадают только необходимые файлы и зависимости.
Зачем это нужно?
- Уменьшение размера образа: В процессе разработки часто используются инструменты и зависимости, которые не нужны в конечном приложении. Multi-stage build позволяет исключить их из финального образа.
- Повышение безопасности: Меньший образ содержит меньше потенциальных уязвимостей.
- Упрощение управления зависимостями: Каждый этап может иметь свои зависимости, которые не будут мешать друг другу.
Как это работает?
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, где процесс сборки может быть сложным и требовать множества инструментов и библиотек, которые не нужны в конечном образе.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться