Контейнеризация приложений - 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
По многочисленным заявкам трудящихся и учащихся выкладываю репу: github.com/alex-kosarev/spring-boot-docker-with-maven там же заготовка статьи, можете читать, информации даже больше, чем в ролике.
Спасибо за проделанную работу, отличный материал
Благодарю за видео, познавательно.
Классно, товарищ сосед с Кургана) подробно, понятно, нужное. Спасибо за твое время!
Видео и подача просто прекрасны!!! С удовольствием бы посмотрел уроки по maven и gradle в твоем исполнении. Спасибо за проделанный труд и успехов будущем
Подача материала и практические примеры одни из самый крутых среди ютюб каналов по спрингу. Рад, что случайно наткнулся на канал!)
Удивительно, но классическая задача может быть решена различными способами! Познавательное видео!)
Отличный материал, вспомнил как начинал, прослезился 🥲, искренне благодарен отличная подача, а про то что не так идет это просто шикарно, становится скучно когда все идет гладко или же монотонно подается а тут хоба изюминка )))
"нет видосов чтоб не запнулся" - но у тебя довольно чистая речь, без паразитов! кроме того, когда возникают проблемы и ты их показываешь как решаешь это ценнее, чем вылизанные видео. когда приступаешь сам что-то пробовать, никогда не получается, даже по вылизанным видео и начинаешь гуглить лазить и не факт что решишь как
Всё чётко и понятно, спасибо большое!
Интересно смотреть 👍 А то что не все гладко - так даже лучше, живой видос получился! Про кубер серия видосов была бы полезна!!! Ждём!)
Спасибо! Отличное видео
поддержим)
Спасибо за видео, оч полезно
Как всегда крутое видео
Добрый день! Видосы с косяками лучше!!! Сразу учимся и косяки исправлять.
Спасибо!!
Отличное видео. Спасибо. А планируется видео с подключением ну скажем БД к сервису в контейнере?
Наверняка я эту тему буду ковырять в дальнейших роликах про работу с Docker
Спасибо за очередное очень крутое и понятное в то же время видео. Подскажите, пожалуйста, а какую цветовую схему Вы используете в IDE ? Уж больно понравилась. Спасибо за труд!
Это New UI, появившийся в 2023
Отличный выбор темы. Пользуюсь вторым вариантом, не знал про Spring Boot Maven Plugin одной командой. Я так понимаю, этот вариант нельзя использовать с docker-compose, без DockerFile?
Ну, теоретически можно собирать образ в Docker Compose при помощи mvn spring-boot:build-image, но нужно, чтобы Docker был доступен из контейнера. Ну или попробовать собирать при помощи pack после сборки проекта Maven-ом, как это делается внутри плагина. Я, если честно, не пробовал копаться в этом направлении.
Привет. Огромное спасибо за проделанную тобой работу. Столкнулся с проблемой при сборке приложения описанным тобой образом(сборка в докер контейнере). Если у нас в проекте есть интеграционные тесты использующие testcontainers для поднятия тестовой базы данных, то сборка падает на тестах при попытке запустить контейнер с базой. Как поступать в таких случаях? Устанавливать докер в докере?
Если сборка происходит в докере, то ничего не поможет, в том числе и DinD. Как вариант - скриптом запускать нужные контейнеры до запуска сборки и останавливать после сборки. Либо собирать не в докере.
класс!!! но серый цвет не используйте плииз - смотрел на позитиве и потом серый цвет и настроение падает, боль, страдания и ПОТРАЧЕНО))) видео огонь, вс ев одном ролике ОГРОМНОЕ СПАСИБО!
Я хотел ещё звук из GTAV вставить, но было лень))
35:46 gradle
Был бы признателен, если бы вы смогли прикладывать ссылку на git, т.к хочется поработать с этим же материалом самому но из за вставок заготовленного материала порой приходится разбираться что откуда. Не в качестве критики, а в контексте просьбы, если это не сложно осуществить. Спасибо за материал
Я постараюсь на этой неделе 2 статьи опубликовать, а к ним и репозитории
репу бы желательно получить, чтобы поиграться, заморачиваться и чистить не надо, нам и так понятно что вылизывание это трудозатратно
github.com/alex-kosarev/spring-boot-docker-with-maven
Александр пришлите вариант с gradle. В гитхабе только мавен. Может ветку с грэдолом сделаете и здесь сообщите об этом?
Будет на днях
Спасибо! Вопрос! Можете ли вы записать видео о том, как передавать извне данные при запуске контейнера для подключения, например, к базам данных, которые автоматически в application.yaml попадают ? Иначе получается что если нужно поменять хост/пользователя нужно image пересобирать)
Так я же показывал в ролике и статье, это можно сделать двумя способами:
1. При помощи аргументов запуска: docker run ... --spring.datasource.url=...
2. При помощи переменных окружения: docker run -e SPRING_DATASOURCE_URL=... ...
Плюс можно пользоваться распределёнными конфигурациями, которые позволяют изменять настройки "на лету": Consul, Spring Cloud Config Server и т.д.
@@shurik_codes Большое спасибо за ответ, обязательно прочитаю статью!
А как на счет сборки приложения используя гугловый плагин jib?
Интересная тема, тянущая на отдельный материал)
Александр, будем обсуждать оркестрацию?
Скоро)
При сборке приложения с помощью bootBuildImage не работает запись файлов на диск, может кто знает как решить эту проблему?
Есть какие-то ошибки в логах сборки?
Нет, сборка проходит нормально, все работает, но при работе котейнера нет прав доступа на запись файлов, У меня диск использовался для временной записи файлов перед отправкой в s3, компрессии изображений и др,. в итоге переделал все на in-memory модель с помощью inputStream-ов, теперь даже быстрее все работает))) Но может есть все таки возможность включить этот доступ и интересно внутри образа приложение в какую папку копируется, чтоб сделать проброс volume. Спасибо за внимание к вопросу)
Если планируется писать в какую-то директорию файлы, то на этапе сборки нужно создать эту директорию и выдать права на неё пользователю, от имени которого будет запускаться приложение (если пользователь - не root, ему можно всё).
У вас стоит комюнити версия или ултимейт?
Ultimate
@@shurik_codes А сможете на эклипсе показать?
О, так вы ещё и комментарии удаляете, молодца..
Нет, я комментарии не удаляю в принципе
@@shurik_codes Я первым писал комментарий о том что создвать пользователей при сборке имеджа не нужно. Советовал посмотреть Dockerfile сгенерированного проекта Quarkus. Как там создаётся пользователь и что там даётся параметром в команде USER. Не нужно создавать имя при сборке имеджа. Это лишнее. Там достаточен только ID-пользователя и чтобы он не совпадал с ID суперпользователя. Вы не знакомы с тем какую роль играют в *nix имя пользователя и его ID. А моё сообщение удалили ))). Ай яй яй...
Спасибо, отличное видео) Подскажите, как установить имя контейнера при сборке образа при помощи build.gradle.kts?
tasks.named("bootBuildImage") {
this.imageName.set("my-image")
}
Спасибо большое, а то я просто писал imageName = "name", а оно R/O) Чет не видел сеттер, да я. и забыл уже почти про них с Котлином)
Еще раз спасибо, подскажите пожалуйста, как в конфигурации build.gradle.kts установить активные профили для собираемого образа с помощью задачи
bootBuildImage? Что то ничего рабочего не найду)
Нашел ответ:
Раньше, когда использовал докер, прописывал дополнительный параметр в Dockerfile:
CMD ["java", "-Dspring.profiles.active=main, remote", "-server", "-jar", "/app/client.jar"]
Сейчас при сборке через bootBuildImage, нужно просто при старте контейнера переменную передать ту же или эту:
SPRING_PROFILES_ACTIVE=main,remote
Попробовал повторить за автором на своём проекте - не вышло. Тогда клонировал репозиторий на ГитХабе и пошагово по инструкции попытался повторить. Опять запоролся на первом этапе с той же самой ошибкой "$ 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"
Но за видео лайк, буду разбираться )
Постараюсь ответить завтра
Здравствуйте, Александр, с такой же проблемой столкнулся-Error: Could not find or load main class...
В финальной версии проекта при сборке интегрируется плагин Spring Boot, который упаковывает нестандартный JAR, поэтому JVM не может найти класс. Нужно либо отключить плагин spring-boot-maven-plugin (удалить executions), либо удалить его@@egordrozdov2159