«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Создание образа Docker приложения Spring Boot с использованием пакетов сборки

Создание образа Docker приложения Spring Boot с использованием пакетов сборки

Опубликовано 5 ноября 2024 г.
Просматривать:952

Creating Docker Image of Spring Boot Application using Buildpacks

Введение

Вы создали приложение Spring Boot. Оно отлично работает на вашем локальном компьютере, и теперь вам нужно развернуть приложение где-то еще. На некоторых платформах вы можете напрямую отправить файл jar, и он будет развернут. В некоторых местах вы можете запустить виртуальную машину, загрузить туда исходный код, собрать ее и запустить. Но в большинстве случаев вам придется развертывать приложение с помощью контейнеров. Большую часть времени Docker используется для сборки и запуска образа в контейнере. Кроме того, когда вы загружаете файл jar на некоторые платформы, приложение запускается внутри контейнера под капотом.

Итак, в этом блоге мы увидим 3 различных способа создания образа Docker для данного приложения Spring Boot. Начнём:

Базовый образ контейнера

Наивный и недостаточный способ создания образа Docker для любого приложения — использовать простой Dockerfile, который копирует файл jar внутри образа и запускает его с помощью команды java -jar.

Создать докер-файл

Вот Dockerfile, который можно поместить в корень проекта:

FROM eclipse-temurin:21-jre-ubi9-minimal

ARG JAR_FILE

COPY ${JAR_FILE} application.jar

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

Мы указали один аргумент JAR_FILE, который является расположением используемого jar-файла.

Создание образа Docker

После создания вышеуказанного файла Docker для создания образа Docker используются следующие шаги:

  1. Создайте jar-файл для проекта Spring Boot:

    ./gradlew bootJar # For Gradle build system
    

    ИЛИ

    ./mvnw spring-boot:build-jar # For Maven build system
    
  2. Используйте Dockerfile для создания образа Docker с использованием последней версии jar-файла. В приведенной ниже команде замените {IMAGE_NAME} на необходимое имя изображения и {JAR_FILE} на путь к сгенерированному файлу jar. Имя изображения также содержит тег, например - mycompany/product-service:0.0.1-SNAPSHOT:

    docker build --build-arg JAR_FILE={JAR_FILE} --tag {IMAGE_NAME} .
    
  3. Проверьте, создан ли образ Docker, с помощью следующей команды. Вы должны увидеть изображение с именем, указанным в приведенной выше команде:

    docker images
    

Эффективный образ контейнера с использованием многоуровневого Jar

Хотя можно и легко упаковать jar Spring Boot uber как образ Docker (как упоминалось в предыдущем методе), копирование и запуск fat jar в образе Docker имеет множество недостатков. Например,

  • При запуске uber jar без его распаковки возникают дополнительные расходы.
  • Размещение кода приложения и всех его зависимостей на одном уровне не является оптимальным.

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

Включить многоуровневую банку

Чтобы создать многоуровневый образ Docker, нам нужно сначала создать многоуровневый jar-файл. В настоящее время он включен по умолчанию в Gradle и Maven. Вы можете включить или отключить многоуровневое поведение jar, используя следующий параметр:

// build.gradle
tasks.named("bootJar") {
    layered {
        enabled = false
    }
}
// build.gradle.kts
tasks.named("bootJar") {
   layered {
      enabled.set(false)
   }
}

org.springframework.bootspring-boot-maven-plugintrue

Вы даже можете настроить способ создания слоев. См. документацию по настройке gradle или maven.

Создать докер-файл

Ниже приведен файл Dockerfile, который можно использовать для использования многоуровневого jar-файла и создания многоуровневого образа Docker приложения Spring Boot.

# Perform the extraction in a separate builder container
FROM eclipse-temurin:21-jre-ubi9-minimal AS builder

WORKDIR /builder

# This points to the built jar file in the target folder
# Adjust this to 'build/libs/*.jar' if you're using Gradle
ARG JAR_FILE=target/*.jar

# Copy the jar file to the working directory and rename it to application.jar
COPY ${JAR_FILE} application.jar

# Extract the jar file using an efficient layout
RUN java -Djarmode=tools -jar application.jar extract --layers --destination extracted

# This is the runtime container
FROM eclipse-temurin:21-jre-ubi9-minimal

WORKDIR /application

# Copy the extracted jar contents from the builder container into the working directory in the runtime container
# Every copy step creates a new docker layer
# This allows docker to only pull the changes it really needs
COPY --from=builder /builder/extracted/dependencies/ ./
COPY --from=builder /builder/extracted/spring-boot-loader/ ./
COPY --from=builder /builder/extracted/snapshot-dependencies/ ./
COPY --from=builder /builder/extracted/application/ ./

# Start the application jar - this is not the uber jar used by the builder
# This jar only contains application code and references to the extracted jar files
# This layout is efficient to start up and CDS friendly
ENTRYPOINT ["java", "-jar", "application.jar"]

Создание образа Docker

Шаги по созданию многоуровневого образа Docker такие же, как и при создании базового образа Docker. Пожалуйста, обратитесь туда.

Облачные пакеты сборки

Что, если я скажу вам, что вы можете создать образ Docker, не создавая Dockerfile? Мы можем создавать образы докеров непосредственно из плагина Gralde или Maven, используя Cloud Native Buildpacks. Некоторые платформы (например, Heroku или Cloud Foundry) используют Buildpacks для преобразования предоставленных jar-файлов в работоспособные образы.

Spring Boot включает поддержку сборок непосредственно для Maven и Gradle. Нам не нужно включать какие-либо дополнительные плагины. Просто запустите следующую команду:

./gradlew bootBuildImage # For gradle build system

ИЛИ

./mvnw spring-boot:build-image # For maven build system

Приведенная выше команда создает изображение с именем по умолчанию {PROJECT_NAME}:${PROJECT_VERSION}. Если вы хотите настроить имя сгенерированного изображения, вы можете выполнить следующие шаги:

Настройте имя образа для системы сборки Gradle

Мы можем настроить задачу bootBuildImage для установки имени образа, например:

// For build.gradle.kts
val imagePrefix = "javarush"
val dockerImageName = "docker-example"
tasks.named("bootBuildImage") {
   imageName.set("${imagePrefix}/${dockerImageName}:${version}")
}
// For build.gradle
def imagePrefix = "javarush"
def dockerImageName = "docker-example"
tasks.named("bootBuildImage") {
   imageName = "${imagePrefix}/${dockerImageName}:${version}"
}

Настройте имя образа для системы сборки Maven.

Мы можем настроить Spring-boot-maven-plugin для использования другого имени образа, например:

javarush

...

org.springframework.bootspring-boot-maven-plugin${imagePrefix}/${project.artifactId}:${project.version}

Настройте имя изображения при выполнении команды

Мы даже можем определить имя образа при запуске команды для создания образа.

./gradlew bootBuildImage --imageName=javarush/docker-example:1.0.0 # For grade build system

./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=javarush/docker-example:1.0.0 # For maven build system

Вы можете просмотреть документацию для дальнейшей настройки плагина Gradle или Maven.
Это мой основной метод создания образа Docker для любого приложения Spring Boot.

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

После создания образа Docker вам необходимо убедиться, что он работает должным образом. Убедившись, что образ создан, вы можете напрямую запустить его с помощью команды docker run. Например,

docker run -p "8080:8080" {IMAGE_NAME}

Но в производственных приложениях изображения используются не так. Docker Compose используется для запуска и управления несколькими образами Docker.

Заключение

В этом блоге мы увидели, как создавать образы Docker для приложений Spring Boot, используя различные методы. Умение создавать образы Docker для ваших приложений — это обязательный навык, потому что именно образ доставляется. Спасибо, что дочитали статью до конца. Я ценю это. Я встречусь с тобой в следующем. Как всегда, все отзывы и предложения приветствуются.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/himanshu-pareek/creating-docker-image-of-spring-boot-application-using-buildpacks-5dbo?1. В случае нарушения прав обращайтесь по адресу Study_golang@163. .com, чтобы удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3