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

Что такое Multi-stage builds в Docker

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

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

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

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

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

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

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

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

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

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-образы, что особенно важно в производственных средах, где размер и безопасность контейнеров имеют критическое значение.

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

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

Твои заметки