Что делает Dockerfile при запуске Java приложения в Docker?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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"]
Процесс выполнения при запуске
- FROM — загружается базовый образ (опenjdk/eclipse-temurin)
- WORKDIR — создается или переходит в /app директорию
- COPY — копируются файлы приложения
- ENV — устанавливаются переменные окружения
- EXPOSE — документируется какие порты использует приложение
- 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 приложение в контейнер. Все инструкции выполняются последовательно, создавая слои образа, что обеспечивает воспроизводимость и масштабируемость.