← Назад к вопросам

Что делает Dockerfile при запуске Java приложения в Docker?

2.0 Middle🔥 121 комментариев
#Docker, Kubernetes и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Dockerfile для Java приложения

Dockerfile — это текстовый файл с набором инструкций для создания образа Docker контейнера. При запуске Java приложения Dockerfile выполняет ряд важных этапов для подготовки среды и запуска приложения.

Основные инструкции

1. FROM — выбор базового образа

Первая и обязательная инструкция. Определяет базовый образ, на котором будет строиться наш образ.

// В Dockerfile (не Java код, но пример)
FROM openjdk:17-slim
// Или современный вариант
FROM eclipse-temurin:17-jre-alpine

openjdk — содержит полный JDK (включая компилятор)
eclipse-temurin — легче и быстрее, хороший JRE для production

2. WORKDIR — установка рабочей директории

Задает директорию, где будут выполняться все последующие команды и где находится приложение.

WORKDIR /app
// Все команды ниже выполняются в /app

3. COPY — копирование файлов

Копирует файлы с хост-системы в контейнер. Для Java приложения копируем JAR файл.

COPY target/myapp-1.0.0.jar app.jar
// Копирует собранный JAR в контейнер

4. EXPOSE — открытие портов

Объявляет, какие порты использует приложение. Не открывает порты, а только документирует.

EXPOSE 8080
// Приложение использует порт 8080

5. ENTRYPOINT — команда запуска

Задает команду, которая выполняется при старте контейнера. Это основной способ запуска Java приложения.

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

6. CMD — аргументы по умолчанию

Задает аргументы, которые передаются в ENTRYPOINT. Используется реже.

CMD ["--spring.profiles.active=production"]
// Может переопределяться при запуске контейнера

Полный пример Dockerfile для Spring Boot

# Этап 1: сборка (multi-stage build)
FROM maven:3.9-eclipse-temurin-17 AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests

# Этап 2: runtime
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /build/target/app-1.0.0.jar app.jar

# Оптимизация памяти JVM
ENV JAVA_OPTS="-XX:+UseG1GC -XX:MaxRAMPercentage=75.0"

EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

Процесс выполнения при запуске

  1. FROM — загружается базовый образ (опenjdk/eclipse-temurin)
  2. WORKDIR — создается или переходит в /app директорию
  3. COPY — копируются файлы приложения
  4. ENV — устанавливаются переменные окружения
  5. EXPOSE — документируется какие порты использует приложение
  6. ENTRYPOINT/CMD — запускается Java приложение

Оптимизация

Multi-stage build — собирает приложение в одном контейнере, затем копирует готовый JAR в чистый контейнер. Это значительно уменьшает размер финального образа.

// Большой образ с Maven/Java SDK (для сборки)
FROM maven:3.9-jdk-17 AS builder

// Маленький образ с только JRE (для запуска)
FROM eclipse-temurin:17-jre-alpine
COPY --from=builder /path/to/app.jar .

Переменные окружения

ENV JAVA_OPTS="-XX:+UseG1GC -XX:MaxRAMPercentage=75.0"
ENV LOG_LEVEL=INFO
ENV DATABASE_URL=jdbc:postgresql://db:5432/mydb

Запуск контейнера

// Сборка образа
docker build -t myapp:1.0.0 .

// Запуск контейнера
docker run -p 8080:8080 -e JAVA_OPTS="-Xmx512m" myapp:1.0.0

Dockerfile — это декларативный способ описать, как упаковать Java приложение в контейнер. Все инструкции выполняются последовательно, создавая слои образа, что обеспечивает воспроизводимость и масштабируемость.