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

Сколько может быть инструкций FROM в Dockerfile

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

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

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

Dockerfile — это текстовый файл, содержащий инструкции для сборки Docker-образа. Одна из ключевых инструкций в Dockerfile — это инструкция FROM. Она определяет базовый образ, на основе которого будет строиться новый образ.

Зачем нужны несколько инструкций FROM

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

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

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

Пример многоэтапной сборки

# Первый этап: сборка приложения
FROM golang:1.17 AS builder
​
# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /app
​
# Копируем файлы проекта в контейнер
COPY . .
​
# Компилируем приложение
RUN go build -o myapp
​
​
# Второй этап: создание минимального образа
FROM alpine:latest
​
# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /root/
​
# Копируем скомпилированное приложение из предыдущего этапа
COPY --from=builder /app/myapp .
​
# Указываем команду для запуска приложения
CMD ["./myapp"]

Объяснение примера

  1. Первый этап (FROM golang:1.17 AS builder):

    • Используется образ golang:1.17 для компиляции Go-приложения.
    • Устанавливается рабочая директория /app.
    • Копируются все файлы проекта в контейнер.
    • Выполняется команда go build, которая компилирует приложение и создает исполняемый файл myapp.
  2. Второй этап (FROM alpine:latest):

    • Используется минимальный образ alpine:latest для создания конечного образа.
    • Устанавливается рабочая директория /root/.
    • Копируется скомпилированное приложение myapp из первого этапа.
    • Указывается команда CMD ["./myapp"] для запуска приложения при старте контейнера.

Применение

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

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

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

Твои заметки