Какова роль Dockerfile при запуске Java-приложения в Docker?

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

Ответ

Dockerfile — это текстовый файл с инструкциями для автоматической сборки Docker-образа. Для Java-приложения он выполняет следующие ключевые шаги:

  1. Выбор базового образа: Определяет среду выполнения. Для Java это обычно образ с JDK или JRE.

    FROM openjdk:17-jdk-slim
  2. Копирование артефакта: Переносит скомпилированное приложение (например, JAR-файл) внутрь образа.

    COPY target/myapp.jar /app.jar
  3. Определение точки входа: Задает команду, которая будет выполнена при запуске контейнера.

    ENTRYPOINT ["java", "-jar", "/app.jar"]

Пример полного Dockerfile:

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/myapp.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Best Practices и нюансы:

  • Многоступенчатая сборка: Используйте multi-stage build для создания минимального финального образа, копируя только JAR-файл из промежуточного образа-сборщика.
  • Выбор образа: Для продакшена предпочтительнее использовать JRE-образы (openjdk:17-jre-slim), а не полный JDK, чтобы уменьшить размер и поверхность атаки.
  • Конкретные версии: Всегда указывайте конкретный тег базового образа (не latest) для воспроизводимости сборок.
  • Spring Boot: Для приложений на Spring Boot можно использовать плагин spring-boot-maven-plugin с целью spring-boot:build-image для создания оптимизированных Cloud Native Buildpack-образов.