Для чего нужна директива FROM в Dockerfile
Что проверяют
Понимаете ли вы, что образ строится слоями поверх базового, и умеете ли выбрать этот базовый образ для Java-сервиса осознанно. Следом обычно спрашивают про многоэтапную сборку и про то, почему итоговый образ получился таким тяжёлым.
Как отвечать
FROM задаёт базовый образ, поверх слоёв которого ложатся все следующие инструкции. Это первая инструкция Dockerfile: до неё допустимы только комментарии, директивы парсера и ARG, значение которого можно подставить в сам FROM. FROM scratch означает пустой образ.
Что сказать применительно к Java:
- выбор образа: официальный
openjdkна Docker Hub объявлен устаревшим и не обновляется. Сейчас берутeclipse-temurin,amazoncorrettoили Liberica, причём для запуска хватает JRE:eclipse-temurin:21-jre; - многоэтапная сборка: каждый
FROMначинает новый этап. Первый,FROM maven:3.9-eclipse-temurin-21 AS build, собирает jar, второй берёт лёгкий JRE-образ и копирует артефакт черезCOPY --from=build. В итоговый образ попадает только последний этап, без Maven и исходников; - тег: не
latest, а конкретная версия, в проде часто с дайджестом@sha256:..., чтобы сборка была воспроизводимой; - размер и безопасность: меньше пакетов в базе означает меньше находок у сканера уязвимостей. Для этого есть distroless-образы и Alpine, но у Alpine musl вместо glibc, что иногда ломает нативные библиотеки.
Полезно упомянуть, что современные JVM видят лимиты контейнера, и память удобнее задавать через -XX:MaxRAMPercentage, а не жёстким -Xmx. И что образ Spring Boot можно собрать вовсе без Dockerfile: через Jib или bootBuildImage на buildpacks.
Где спотыкаются
Называют несколько FROM «многоуровневым образом» и не могут объяснить, что предыдущие этапы в финальный образ не попадают.
Берут полный JDK или openjdk:11 из старых туториалов и везут в прод компилятор, устаревшую Java и лишние сотни мегабайт.
Копируют весь проект одной командой до сборки. Любая правка кода сбрасывает кэш слоёв, и зависимости Maven качаются заново. Сначала копируют pom.xml и скачивают зависимости, потом исходники.