Sobes.tech
Назад к вопросам
Junior — Middle
68

Объясните, что означает создание Docker образа с нуля с помощью инструкции FROM в Dockerfile

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Инструкция FROM задаёт базовый образ, от которого строится новый Docker image. Если указать FROM scratch, образ собирается практически с нуля, без родительского слоя и без стандартной ОС внутри. Такой подход используют для максимально маленьких и контролируемых образов, когда все нужные бинарники и зависимости добавляются явно.

Определение:

FROM в Dockerfile определяет стартовую точку сборки образа. Обычно это готовый базовый образ, например python:3.12-slim, который уже содержит ОС-слой и нужную среду.
Если используется FROM scratch, Docker не берёт никакой базовый слой вообще — образ начинается пустым. Это не означает, что внутри не будет файлов: их нужно добавить вручную через COPY или собрать статически скомпилированный бинарник. Такой подход часто применяют для минимальных production-образов.

Пример использования:

Например, можно собрать минимальный образ для простого Go-приложения:

FROM scratch
COPY app /app
ENTRYPOINT ["/app"]

Здесь app — заранее собранный статический бинарник. В итоговом образе нет shell, пакетного менеджера и стандартных библиотек ОС, только сам файл приложения.

Пояснение кода:

Код нужен, потому что именно Dockerfile показывает смысл FROM scratch.

  1. FROM scratch — Docker начинает сборку с пустого образа.
  2. COPY app /app — в образ добавляется только один файл: бинарник приложения.
  3. ENTRYPOINT ["/app"] — при запуске контейнер будет выполнять этот бинарник.

Если в app есть динамические зависимости от библиотек ОС, такой образ может не запуститься. Поэтому для scratch обычно используют статически собранные бинарники или очень внимательно добавляют всё необходимое вручную.

Ключевые моменты:

  • FROM задаёт базовый слой, с которого начинается сборка образа.
  • FROM scratch означает полностью пустой старт без родительского образа.
  • Такой образ обычно минимален по размеру и поверхности атаки.
  • Для scratch нужно явно добавить все нужные файлы и зависимости.
  • Подходит для статических бинарников и простых runtime без внешних зависимостей.
  • Нельзя ожидать внутри scratch привычных инструментов вроде shell или apt.