Что такое Multi-stage builds в Docker
1️⃣ Как кратко ответить
Multi-stage builds в Docker позволяют создавать более легкие и оптимизированные образы, разделяя процесс сборки на несколько этапов. Это позволяет использовать разные базовые образы для различных стадий сборки и копировать только необходимые артефакты в финальный образ, уменьшая его размер и улучшая безопасность.
2️⃣ Подробное объяснение темы
Multi-stage builds в Docker — это методология, которая позволяет разделить процесс сборки контейнера на несколько этапов, каждый из которых может использовать свой собственный базовый образ. Это особенно полезно для оптимизации размера конечного Docker-образа и повышения безопасности.
Зачем это нужно
-
Оптимизация размера образа: В процессе сборки приложения могут использоваться различные инструменты и зависимости, которые не нужны в финальном образе. Multi-stage builds позволяют исключить их из финального образа, копируя только необходимые артефакты.
-
Повышение безопасности: Уменьшение количества слоев и зависимостей в финальном образе снижает поверхность атаки и уменьшает вероятность уязвимостей.
-
Упрощение процесса сборки: Разделение на этапы позволяет использовать разные инструменты и окружения для сборки и выполнения, что упрощает управление зависимостями и конфигурациями.
Как это работает
Multi-stage builds реализуются с помощью нескольких блоков FROM в Dockerfile. Каждый блок FROM начинает новый этап сборки. Вы можете копировать артефакты из одного этапа в другой, используя директиву COPY --from.
Пример Dockerfile с Multi-stage builds
# Первый этап: сборка приложения
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): Используется образ Golang для сборки приложения. Мы устанавливаем рабочую директорию/app, копируем все файлы проекта в контейнер и выполняем командуgo build, чтобы скомпилировать приложение. Результатом этого этапа является исполняемый файлmyapp. -
Второй этап (
FROM alpine:latest): Используется легковесный образ Alpine Linux для создания финального образа. Мы устанавливаем рабочую директорию/appи копируем только скомпилированный исполняемый файлmyappиз предыдущего этапа (COPY --from=builder /app/myapp .). Это позволяет исключить все ненужные зависимости и инструменты сборки из финального образа. -
Команда запуска (
CMD ["./myapp"]): Указывает, что при запуске контейнера будет выполнен исполняемый файлmyapp.
Multi-stage builds позволяют создавать более легкие и безопасные Docker-образы, что особенно важно в производственных средах, где размер и безопасность контейнеров имеют критическое значение.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться