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