Карта / Docker / Dockerfile

Dockerfile

Dockerfile — текстовый файл с инструкциями, как собрать образ приложения (см. тему «Образ и контейнер»), шаг за шагом.

FROM eclipse-temurin:17-jdk      # базовый образ — Java 17

WORKDIR /app                       # рабочая директория внутри контейнера

COPY target/app.jar app.jar        # скопировать собранный jar внутрь образа

EXPOSE 8080                          # документирует, какой порт слушает приложение

ENTRYPOINT ["java", "-jar", "app.jar"]   # команда запуска контейнера
docker build -t my-app .    # собрать образ из Dockerfile в текущей папке
docker run -p 8080:8080 my-app   # запустить, пробросив порт наружу
Копнуть глубже

Multi-stage build — собирать и запускать в разных образах, чтобы итоговый образ не тащил за собой инструменты сборки:

# этап 1: сборка (нужен Maven, исходники)
FROM maven:3.9-eclipse-temurin-17 AS build
WORKDIR /app
COPY . .
RUN mvn package -DskipTests

# этап 2: запуск (нужен только JRE и готовый jar)
FROM eclipse-temurin:17-jre
COPY --from=build /app/target/app.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

Финальный образ содержит только JRE и готовый .jar, а не весь Maven с исходным кодом — это сильно уменьшает размер итогового образа (важно для скорости деплоя) и убирает из продакшен-образа лишние инструменты, которые там не нужны и потенциально расширяют поверхность атаки.

Порядок инструкций важен из-за кэширования слоёв — стоит копировать файлы, которые меняются реже (например, pom.xml с зависимостями), раньше часто меняющегося кода приложения, чтобы Docker мог переиспользовать кэшированный слой с зависимостями, даже когда меняется только бизнес-логика.

🎤 Закрыл тему, если можешь объяснить:
• из чего состоит базовый Dockerfile (FROM, COPY, ENTRYPOINT);
• зачем нужен multi-stage build (если дошёл до 2-го слоя).