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

Для чего используется несколько инструкций FROM в Dockerfile

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

Инструкции FROM в Dockerfile используются для создания многоступенчатых сборок (multi-stage builds), что позволяет оптимизировать размер конечного образа, разделяя процесс сборки на несколько этапов и копируя только необходимые артефакты в финальный образ.

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

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

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

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

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

Рассмотрим пример 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++, и других, где процесс сборки требует множества зависимостей, которые не нужны в финальном образе. Это позволяет значительно уменьшить размер образа и повысить его безопасность и производительность.

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

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

Твои заметки