Обязательна ли директива FROM в Dockerfile?

«Обязательна ли директива FROM в Dockerfile?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, директива FROM является обязательной для любого валидного Dockerfile. Она задает базовый образ, от которого наследуется собираемый контейнер. Docker не может начать сборку без отправной точки.

Исключение: образ scratch

scratch — это пустой, нулевой образ. Он используется для создания минимальных контейнеров, например, для статически скомпилированных приложений (Go, C++).

Пример Dockerfile с scratch:

# Базовый образ — «ничего»
FROM scratch

# Копируем в контейнер единственный исполняемый файл
COPY myapp /myapp

# Указываем команду для запуска
CMD ["/myapp"]

Динамический выбор базового образа

С помощью директивы ARG можно параметризовать выбор базового образа, но FROM все равно требуется.

ARG BASE_IMAGE=openjdk:17-alpine
FROM ${BASE_IMAGE}
...

Итог: Без FROM сборка завершится ошибкой. Использование FROM scratch — это способ начать с абсолютно пустой файловой системы, а не обойти требование директивы.