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

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

Комментарии • 60

  • @shurik_codes
    @shurik_codes  8 месяцев назад +7

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

    • @alexandr7722
      @alexandr7722 8 месяцев назад +1

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

  • @artyomzolotoverkhov8468
    @artyomzolotoverkhov8468 16 дней назад +1

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

  • @mikhailyegorov27
    @mikhailyegorov27 8 месяцев назад +3

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

  • @vshum44
    @vshum44 3 месяца назад +2

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

  • @eugenz2334
    @eugenz2334 8 месяцев назад +2

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

  • @Edu-wi3il
    @Edu-wi3il 8 месяцев назад +3

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

  • @nurbekabdirasulov1150
    @nurbekabdirasulov1150 8 месяцев назад +2

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

  • @mikhailyegorov27
    @mikhailyegorov27 8 месяцев назад +2

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

  • @arrgonenasta1491
    @arrgonenasta1491 5 месяцев назад +1

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

  • @vitovt94
    @vitovt94 8 месяцев назад +5

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

  • @chesseranapa
    @chesseranapa 7 месяцев назад +1

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

  • @alexshutov5442
    @alexshutov5442 8 месяцев назад +2

    поддержим)

  • @Qwerty-fn3rf
    @Qwerty-fn3rf 7 месяцев назад +1

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

  • @nikolaymatvienko1090
    @nikolaymatvienko1090 8 месяцев назад +2

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

  • @rainrainov4495
    @rainrainov4495 6 месяцев назад +1

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

  • @user-bn5gq7ok3g
    @user-bn5gq7ok3g 3 месяца назад +1

    Спасибо!!

  • @user-iu6yz6ck6h
    @user-iu6yz6ck6h 8 месяцев назад +3

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

    • @shurik_codes
      @shurik_codes  8 месяцев назад +2

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

  • @eterna11ty
    @eterna11ty 8 месяцев назад +2

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

    • @shurik_codes
      @shurik_codes  8 месяцев назад

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

  • @grigorev.nikita
    @grigorev.nikita 8 месяцев назад +1

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

    • @shurik_codes
      @shurik_codes  8 месяцев назад +1

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

  • @user-vl5ts3mm6e
    @user-vl5ts3mm6e 2 месяца назад +1

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

    • @shurik_codes
      @shurik_codes  2 месяца назад

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

  • @MrMaweer
    @MrMaweer 8 месяцев назад +1

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

    • @shurik_codes
      @shurik_codes  8 месяцев назад

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

  • @amida1632
    @amida1632 2 месяца назад

    35:46 gradle

  • @alexandr7722
    @alexandr7722 8 месяцев назад +4

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

    • @shurik_codes
      @shurik_codes  8 месяцев назад +1

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

    • @MrMaweer
      @MrMaweer 8 месяцев назад +1

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

    • @shurik_codes
      @shurik_codes  8 месяцев назад

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

  • @michaelmuraviev3319
    @michaelmuraviev3319 7 месяцев назад +1

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

  • @devprototype
    @devprototype 7 месяцев назад +1

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

    • @shurik_codes
      @shurik_codes  7 месяцев назад

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

    • @devprototype
      @devprototype 7 месяцев назад

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

  • @DanielAstro
    @DanielAstro 8 месяцев назад +2

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

    • @shurik_codes
      @shurik_codes  8 месяцев назад

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

  • @user-qm2vs8kj2x
    @user-qm2vs8kj2x 7 месяцев назад +1

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

  • @user-ok3xn3vx3h
    @user-ok3xn3vx3h 5 месяцев назад

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

    • @shurik_codes
      @shurik_codes  5 месяцев назад

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

    • @user-ok3xn3vx3h
      @user-ok3xn3vx3h 5 месяцев назад

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

    • @shurik_codes
      @shurik_codes  5 месяцев назад

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

  • @kxeklom
    @kxeklom 8 месяцев назад

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

    • @shurik_codes
      @shurik_codes  8 месяцев назад

      Ultimate

    • @kxeklom
      @kxeklom 8 месяцев назад

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

  • @VolodymyrKvashenko
    @VolodymyrKvashenko 8 месяцев назад

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

    • @shurik_codes
      @shurik_codes  8 месяцев назад +3

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

    • @VolodymyrKvashenko
      @VolodymyrKvashenko 8 месяцев назад

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

  • @user-ok3xn3vx3h
    @user-ok3xn3vx3h 6 месяцев назад +1

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

    • @shurik_codes
      @shurik_codes  6 месяцев назад

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

    • @user-ok3xn3vx3h
      @user-ok3xn3vx3h 6 месяцев назад +1

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

  • @user-ok3xn3vx3h
    @user-ok3xn3vx3h 6 месяцев назад +1

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

    • @user-ok3xn3vx3h
      @user-ok3xn3vx3h 6 месяцев назад +1

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

  • @MgsMen
    @MgsMen 6 месяцев назад +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  6 месяцев назад +1

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

    • @egordrozdov2159
      @egordrozdov2159 5 месяцев назад

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

    • @shurik_codes
      @shurik_codes  5 месяцев назад

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