Контейнеризация приложений - Spring Boot

Поділитися
Вставка
  • Опубліковано 30 вер 2024
  • Разработку и развёртывание современного серверного программного обеспечения сложно представить себе без использования инструментов контейнеризации, ну, а Docker и вовсе, наверняка, на слуху у подавляющего большинства разработчиков.
    Упаковка в контейнеры проектов на платформе Java в целом задача не сложная, но имеет свои нюансы. В этом ролике я рассмотрю следующие сценарии упаковки приложения на основе Spring Boot в OCI-образ:
    - Локальная сборка проекта с последующей упаковкой в Docker-образ
    - Полный цикл сборки проекта в Docker с помощью Dockerfile
    - Сборка образа при помощи Spring Boot Plugin и Paketo Buildpacks
    Все сценарии будут продемонстрированы с использованием Maven и Gradle.
    #java #spring #springboot #docker #gradle #maven
    Мой сайт: alexkosarev.name/
    Паблик в VK: public2...
    Канал в Telegram: t.me/+TZCuO38v...
    Стать доном: donut/s...
    Донаты в Boosty: boosty.to/akos...
    Донаты в Tinkoff: www.tinkoff.ru...

КОМЕНТАРІ • 61

  • @shurik_codes
    @shurik_codes  11 місяців тому +9

    По многочисленным заявкам трудящихся и учащихся выкладываю репу: github.com/alex-kosarev/spring-boot-docker-with-maven там же заготовка статьи, можете читать, информации даже больше, чем в ролике.

    • @alexandr7722
      @alexandr7722 11 місяців тому +1

      Спасибо за проделанную работу, отличный материал

  • @eugenz2334
    @eugenz2334 11 місяців тому +4

    Подача материала и практические примеры одни из самый крутых среди ютюб каналов по спрингу. Рад, что случайно наткнулся на канал!)

  • @vitovt94
    @vitovt94 11 місяців тому +5

    Интересно смотреть 👍 А то что не все гладко - так даже лучше, живой видос получился! Про кубер серия видосов была бы полезна!!! Ждём!)

  • @АлександрКошкин-ъ3ч
    @АлександрКошкин-ъ3ч 6 місяців тому +1

    Привет. Огромное спасибо за проделанную тобой работу. Столкнулся с проблемой при сборке приложения описанным тобой образом(сборка в докер контейнере). Если у нас в проекте есть интеграционные тесты использующие testcontainers для поднятия тестовой базы данных, то сборка падает на тестах при попытке запустить контейнер с базой. Как поступать в таких случаях? Устанавливать докер в докере?

    • @shurik_codes
      @shurik_codes  6 місяців тому

      Если сборка происходит в докере, то ничего не поможет, в том числе и DinD. Как вариант - скриптом запускать нужные контейнеры до запуска сборки и останавливать после сборки. Либо собирать не в докере.

  • @alexandr7722
    @alexandr7722 11 місяців тому +4

    Был бы признателен, если бы вы смогли прикладывать ссылку на git, т.к хочется поработать с этим же материалом самому но из за вставок заготовленного материала порой приходится разбираться что откуда. Не в качестве критики, а в контексте просьбы, если это не сложно осуществить. Спасибо за материал

    • @shurik_codes
      @shurik_codes  11 місяців тому +1

      Я постараюсь на этой неделе 2 статьи опубликовать, а к ним и репозитории

    • @MrMaweer
      @MrMaweer 11 місяців тому +1

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

    • @shurik_codes
      @shurik_codes  11 місяців тому

      github.com/alex-kosarev/spring-boot-docker-with-maven

  • @mikhailyegorov27
    @mikhailyegorov27 11 місяців тому +3

    Классно, товарищ сосед с Кургана) подробно, понятно, нужное. Спасибо за твое время!

  • @mikhailyegorov27
    @mikhailyegorov27 11 місяців тому +2

    "нет видосов чтоб не запнулся" - но у тебя довольно чистая речь, без паразитов! кроме того, когда возникают проблемы и ты их показываешь как решаешь это ценнее, чем вылизанные видео. когда приступаешь сам что-то пробовать, никогда не получается, даже по вылизанным видео и начинаешь гуглить лазить и не факт что решишь как

  • @vshum44
    @vshum44 7 місяців тому +2

    Видео и подача просто прекрасны!!! С удовольствием бы посмотрел уроки по maven и gradle в твоем исполнении. Спасибо за проделанный труд и успехов будущем

  • @Edu-wi3il
    @Edu-wi3il 11 місяців тому +3

    Удивительно, но классическая задача может быть решена различными способами! Познавательное видео!)

  • @АлександрБугримов-о1е
    @АлександрБугримов-о1е 11 місяців тому +3

    Отличное видео. Спасибо. А планируется видео с подключением ну скажем БД к сервису в контейнере?

    • @shurik_codes
      @shurik_codes  11 місяців тому +2

      Наверняка я эту тему буду ковырять в дальнейших роликах про работу с Docker

  • @ДмитрийБусыгин-с3ф
    @ДмитрийБусыгин-с3ф 10 місяців тому +1

    Еще раз спасибо, подскажите пожалуйста, как в конфигурации build.gradle.kts установить активные профили для собираемого образа с помощью задачи
    bootBuildImage? Что то ничего рабочего не найду)

    • @ДмитрийБусыгин-с3ф
      @ДмитрийБусыгин-с3ф 10 місяців тому +1

      Нашел ответ:
      Раньше, когда использовал докер, прописывал дополнительный параметр в Dockerfile:
      CMD ["java", "-Dspring.profiles.active=main, remote", "-server", "-jar", "/app/client.jar"]
      Сейчас при сборке через bootBuildImage, нужно просто при старте контейнера переменную передать ту же или эту:
      SPRING_PROFILES_ACTIVE=main,remote

  • @nurbek-baike
    @nurbek-baike 11 місяців тому +2

    Отличный материал, вспомнил как начинал, прослезился 🥲, искренне благодарен отличная подача, а про то что не так идет это просто шикарно, становится скучно когда все идет гладко или же монотонно подается а тут хоба изюминка )))

  • @rainrainov4495
    @rainrainov4495 10 місяців тому +1

    Добрый день! Видосы с косяками лучше!!! Сразу учимся и косяки исправлять.

  • @DanielAstro
    @DanielAstro 11 місяців тому +2

    А как на счет сборки приложения используя гугловый плагин jib?

    • @shurik_codes
      @shurik_codes  11 місяців тому

      Интересная тема, тянущая на отдельный материал)

  • @eterna11ty
    @eterna11ty 11 місяців тому +2

    Спасибо за очередное очень крутое и понятное в то же время видео. Подскажите, пожалуйста, а какую цветовую схему Вы используете в IDE ? Уж больно понравилась. Спасибо за труд!

    • @shurik_codes
      @shurik_codes  11 місяців тому

      Это New UI, появившийся в 2023

  • @artyomzolotoverkhov8468
    @artyomzolotoverkhov8468 4 місяці тому +1

    Благодарю за видео, познавательно.

  • @alexshutov5442
    @alexshutov5442 11 місяців тому +2

    поддержим)

  • @nikolaymatvienko1090
    @nikolaymatvienko1090 11 місяців тому +2

    Как всегда крутое видео

  • @АлександрШ-й5ж
    @АлександрШ-й5ж 2 місяці тому +1

    Спасибо большое за видео!

  • @amida1632
    @amida1632 6 місяців тому

    35:46 gradle

  • @arrgonenasta1491
    @arrgonenasta1491 8 місяців тому +1

    Всё чётко и понятно, спасибо большое!

  • @MrMaweer
    @MrMaweer 11 місяців тому +1

    класс!!! но серый цвет не используйте плииз - смотрел на позитиве и потом серый цвет и настроение падает, боль, страдания и ПОТРАЧЕНО))) видео огонь, вс ев одном ролике ОГРОМНОЕ СПАСИБО!

    • @shurik_codes
      @shurik_codes  11 місяців тому

      Я хотел ещё звук из GTAV вставить, но было лень))

  • @chesseranapa
    @chesseranapa 11 місяців тому +1

    Спасибо! Отличное видео

  • @grigorev.nikita
    @grigorev.nikita 11 місяців тому +1

    Отличный выбор темы. Пользуюсь вторым вариантом, не знал про Spring Boot Maven Plugin одной командой. Я так понимаю, этот вариант нельзя использовать с docker-compose, без DockerFile?

    • @shurik_codes
      @shurik_codes  11 місяців тому +1

      Ну, теоретически можно собирать образ в Docker Compose при помощи mvn spring-boot:build-image, но нужно, чтобы Docker был доступен из контейнера. Ну или попробовать собирать при помощи pack после сборки проекта Maven-ом, как это делается внутри плагина. Я, если честно, не пробовал копаться в этом направлении.

  • @michaelmuraviev3319
    @michaelmuraviev3319 11 місяців тому +1

    Александр пришлите вариант с gradle. В гитхабе только мавен. Может ветку с грэдолом сделаете и здесь сообщите об этом?

  • @Qwerty-fn3rf
    @Qwerty-fn3rf 11 місяців тому +1

    Спасибо за видео, оч полезно

  • @ДмитрийЛемешенко-ш5п
    @ДмитрийЛемешенко-ш5п 6 місяців тому +1

    Спасибо!!

  • @НикитаИгнатов-ш7к
    @НикитаИгнатов-ш7к 11 місяців тому +1

    Александр, будем обсуждать оркестрацию?

  • @devprototype
    @devprototype 11 місяців тому +1

    Спасибо! Вопрос! Можете ли вы записать видео о том, как передавать извне данные при запуске контейнера для подключения, например, к базам данных, которые автоматически в application.yaml попадают ? Иначе получается что если нужно поменять хост/пользователя нужно image пересобирать)

    • @shurik_codes
      @shurik_codes  11 місяців тому

      Так я же показывал в ролике и статье, это можно сделать двумя способами:
      1. При помощи аргументов запуска: docker run ... --spring.datasource.url=...
      2. При помощи переменных окружения: docker run -e SPRING_DATASOURCE_URL=... ...
      Плюс можно пользоваться распределёнными конфигурациями, которые позволяют изменять настройки "на лету": Consul, Spring Cloud Config Server и т.д.

    • @devprototype
      @devprototype 11 місяців тому

      @@shurik_codes Большое спасибо за ответ, обязательно прочитаю статью!

  • @ДмитрийБусыгин-с3ф
    @ДмитрийБусыгин-с3ф 9 місяців тому

    При сборке приложения с помощью bootBuildImage не работает запись файлов на диск, может кто знает как решить эту проблему?

    • @shurik_codes
      @shurik_codes  9 місяців тому

      Есть какие-то ошибки в логах сборки?

    • @ДмитрийБусыгин-с3ф
      @ДмитрийБусыгин-с3ф 9 місяців тому

      Нет, сборка проходит нормально, все работает, но при работе котейнера нет прав доступа на запись файлов, У меня диск использовался для временной записи файлов перед отправкой в s3, компрессии изображений и др,. в итоге переделал все на in-memory модель с помощью inputStream-ов, теперь даже быстрее все работает))) Но может есть все таки возможность включить этот доступ и интересно внутри образа приложение в какую папку копируется, чтоб сделать проброс volume. Спасибо за внимание к вопросу)

    • @shurik_codes
      @shurik_codes  9 місяців тому

      Если планируется писать в какую-то директорию файлы, то на этапе сборки нужно создать эту директорию и выдать права на неё пользователю, от имени которого будет запускаться приложение (если пользователь - не root, ему можно всё).

  • @kxeklom
    @kxeklom 11 місяців тому

    У вас стоит комюнити версия или ултимейт?

    • @shurik_codes
      @shurik_codes  11 місяців тому

      Ultimate

    • @kxeklom
      @kxeklom 11 місяців тому

      @@shurik_codes А сможете на эклипсе показать?

  • @VolodymyrKvashenko
    @VolodymyrKvashenko 11 місяців тому

    О, так вы ещё и комментарии удаляете, молодца..

    • @shurik_codes
      @shurik_codes  11 місяців тому +3

      Нет, я комментарии не удаляю в принципе

    • @VolodymyrKvashenko
      @VolodymyrKvashenko 11 місяців тому

      @@shurik_codes Я первым писал комментарий о том что создвать пользователей при сборке имеджа не нужно. Советовал посмотреть Dockerfile сгенерированного проекта Quarkus. Как там создаётся пользователь и что там даётся параметром в команде USER. Не нужно создавать имя при сборке имеджа. Это лишнее. Там достаточен только ID-пользователя и чтобы он не совпадал с ID суперпользователя. Вы не знакомы с тем какую роль играют в *nix имя пользователя и его ID. А моё сообщение удалили ))). Ай яй яй...

  • @MgsMen
    @MgsMen 10 місяців тому +1

    Попробовал повторить за автором на своём проекте - не вышло. Тогда клонировал репозиторий на ГитХабе и пошагово по инструкции попытался повторить. Опять запоролся на первом этапе с той же самой ошибкой "$ java -cp lib/*:application.jar pro.akosarev.sandbox.GreetingsMavenApplication
    Error: Could not find or load main class pro.akosarev.sandbox.GreetingsMavenApplication
    Caused by: java.lang.ClassNotFoundException: pro.akosarev.sandbox.GreetingsMavenApplication"
    Но за видео лайк, буду разбираться )

    • @shurik_codes
      @shurik_codes  10 місяців тому +1

      Постараюсь ответить завтра

    • @egordrozdov2159
      @egordrozdov2159 9 місяців тому

      Здравствуйте, Александр, с такой же проблемой столкнулся-Error: Could not find or load main class...

    • @shurik_codes
      @shurik_codes  9 місяців тому

      В финальной версии проекта при сборке интегрируется плагин Spring Boot, который упаковывает нестандартный JAR, поэтому JVM не может найти класс. Нужно либо отключить плагин spring-boot-maven-plugin (удалить executions), либо удалить его@@egordrozdov2159

  • @ДмитрийБусыгин-с3ф
    @ДмитрийБусыгин-с3ф 10 місяців тому +1

    Спасибо, отличное видео) Подскажите, как установить имя контейнера при сборке образа при помощи build.gradle.kts?

    • @shurik_codes
      @shurik_codes  10 місяців тому

      tasks.named("bootBuildImage") {
      this.imageName.set("my-image")
      }

    • @ДмитрийБусыгин-с3ф
      @ДмитрийБусыгин-с3ф 10 місяців тому +1

      Спасибо большое, а то я просто писал imageName = "name", а оно R/O) Чет не видел сеттер, да я. и забыл уже почти про них с Котлином)