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 мог переиспользовать кэшированный слой с зависимостями, даже когда меняется только бизнес-логика.
• зачем нужен multi-stage build (если дошёл до 2-го слоя).