Dependency injection в Kotlin и Koin
Ух я смог! Даже если не являетесь программистом, просто зацените качество картинки и монтажа.
Это только начало, спасибо подписчикам, которые дают советы на тему: "Как делать лучше", я открыт для обратной связи... в планах и дальше развиваться и работать над качеством контента....
Урок: https://www.youtube.com/watch?v=RJ0aMfyabSM
Дока по Koin https://insert-koin.io/docs/quickstart/kotlin
Проект с Koin: github.com/twoZeros/sosial-network
Ух я смог! Даже если не являетесь программистом, просто зацените качество картинки и монтажа.
Это только начало, спасибо подписчикам, которые дают советы на тему: "Как делать лучше", я открыт для обратной связи... в планах и дальше развиваться и работать над качеством контента....
Урок: https://www.youtube.com/watch?v=RJ0aMfyabSM
Дока по Koin https://insert-koin.io/docs/quickstart/kotlin
Проект с Koin: github.com/twoZeros/sosial-network
YouTube
Dependency injection в Kotlin и Koin
В этом видео рассказываю о том что такое внедрение зависимостей и IoC и демонстрирую практическую реализацию на Kotlin и библиотеки KoinДополнительные матери...
🔥5
Теория графов: основы
Долго думал как подойти к повествованию этой темы, а когда появились мемы мне сразу открылся сценарий 😁
https://youtu.be/7cIMMPyHZCY?si=2eJV9odusfKGuZP-
Долго думал как подойти к повествованию этой темы, а когда появились мемы мне сразу открылся сценарий 😁
https://youtu.be/7cIMMPyHZCY?si=2eJV9odusfKGuZP-
YouTube
Теория графов: основы
В этом видео рассказываю самые основы теории Графов и повествую об способах задания графов, для их хранения и обработки с помощью компьютера. Это первое виде...
😁4🔥3
Доп образование в сфере IT с гос. поддержкой.
Если интересуетесь сферой AI, возможно заинтересует прохождение курса на эту тему за 10-20к при полной стоимости около 80к
https://ai.2035.university/?_ga=2.123019851.1524702865.1715862747-1735646360.1715749089#catalog
Многие курсы требует сильной подготовки, но есть и для новичков...
А как вы считаете нужно ли учиться на онлайн-курсах такого формата или же лучше учиться самому в своём темпе по материалам в открытом доступе, книгам....?
Если интересуетесь сферой AI, возможно заинтересует прохождение курса на эту тему за 10-20к при полной стоимости около 80к
https://ai.2035.university/?_ga=2.123019851.1524702865.1715862747-1735646360.1715749089#catalog
Многие курсы требует сильной подготовки, но есть и для новичков...
А как вы считаете нужно ли учиться на онлайн-курсах такого формата или же лучше учиться самому в своём темпе по материалам в открытом доступе, книгам....?
ai.2035.university
Искусственный интеллект | Университет 2035
Допобразование в области искусственного интеллекта и в смежных областях при финансовой поддержке от государства
👍7
Моя первая статья посвященная алгоритмам на графах
https://telegra.ph/Kak-najti-kogo-ugodno-v-socialnyh-setyah-ispolzuya-grafy-i-poisk-v-shirinu-05-19
Кстати могу ещё порекомендовать и эту https://www.baeldung.com/kotlin/bfs-graphs
Baeldung - Белдунг или как там это читается один из лучших обучающих сайтов для джавистов)))
https://telegra.ph/Kak-najti-kogo-ugodno-v-socialnyh-setyah-ispolzuya-grafy-i-poisk-v-shirinu-05-19
Кстати могу ещё порекомендовать и эту https://www.baeldung.com/kotlin/bfs-graphs
Baeldung - Белдунг или как там это читается один из лучших обучающих сайтов для джавистов)))
Telegraph
Как найти кого угодно в социальных сетях используя графы и поиск в ширину
Немного определений Граф - это топологическая модель, которая состоит из множества вершин и множества соединяющих их рёбер. При этом значение имеет только сам факт, какая вершина с какой соединена. Очень многие задачи могут быть решены используя богатую библиотеку…
👍7
Forwarded from СБЕР IT Сочи
Студенты выпускных курсов бакалавриата и магистратуры, это предложение для вас 🥳
Мы запускаем конкурс на позиции стажеров по сопровождению и тестированию⚡️
Стажировка оплачивается и длится 3-6 месяцев. При успешном прохождении у вас есть возможность устроиться в штат
В карточках рассказываем, что вас ждет на стажировке и как попасть в нашу команду
Ссылки на вакансии:
🟢 Инженер сопровождения
🟢 Стажер QA
До встречи в нашем офисе, будущие коллеги 🫱🏼🫲🏻
Мы запускаем конкурс на позиции стажеров по сопровождению и тестированию
Стажировка оплачивается и длится 3-6 месяцев. При успешном прохождении у вас есть возможность устроиться в штат
В карточках рассказываем, что вас ждет на стажировке и как попасть в нашу команду
Ссылки на вакансии:
До встречи в нашем офисе, будущие коллеги 🫱🏼🫲🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤1
Перестань платить за менеджеры задач
Всю эту неделю был погружён в работу с практикантами - студентами из Сириус. Я курирую backend направление и решаю задачи связанные с инфраструктурой.
Как только я узнал о "назначении", я сразу понял, что нам нужен менеджер задач (task tracker).
Поиск менеджера задач
Первая мысль была воспользоваться Яндекс. Трекером , Битрикс24 или другими отечественными решениями, но все они, как под копирку, в бесплатном тарифе имеют ограничение максимум до 5 пользователей, что неподходит, так как надо было минимум 15 учёток...
Есть Trello, там такого орграничения нет, но есть сложности с регистрацией пользователей, которые из РФ.
Решение
Случайно наткнулся на Nextcloud и узнал что он может многое, в том числе и помочь в организации командной работы.
NextCloud (или NC) — это ПО с открытым исходным кодом, которое позволяет организовать собственное облачное хранилище и контролировать хранение данных.
В Nextcloud есть собственный магазин приложений, которые устанавливаются в пару кликов и расширяют возможности Nextcloud: текстовые редакторы, конвертеры видео, видео плееры, ПО для построение интеллектуальных карт, аналог конфлюенса, чего только нет, в том числе есть Task Tracker - Deck.
Установка
Deck на GitHub:
https://github.com/nextcloud/deck
А развернуть Nextcloud можно на виртуальном выделенном сервере, есть официальный Docker image и огромное количество tutorial-ов как это сделать ..
Вот например:
https://zomro.com/rus/blog/faq/302-kak-ustanovit-nextcloud-v-docker
Всю эту неделю был погружён в работу с практикантами - студентами из Сириус. Я курирую backend направление и решаю задачи связанные с инфраструктурой.
Как только я узнал о "назначении", я сразу понял, что нам нужен менеджер задач (task tracker).
Поиск менеджера задач
Первая мысль была воспользоваться Яндекс. Трекером , Битрикс24 или другими отечественными решениями, но все они, как под копирку, в бесплатном тарифе имеют ограничение максимум до 5 пользователей, что неподходит, так как надо было минимум 15 учёток...
Есть Trello, там такого орграничения нет, но есть сложности с регистрацией пользователей, которые из РФ.
Решение
Случайно наткнулся на Nextcloud и узнал что он может многое, в том числе и помочь в организации командной работы.
NextCloud (или NC) — это ПО с открытым исходным кодом, которое позволяет организовать собственное облачное хранилище и контролировать хранение данных.
В Nextcloud есть собственный магазин приложений, которые устанавливаются в пару кликов и расширяют возможности Nextcloud: текстовые редакторы, конвертеры видео, видео плееры, ПО для построение интеллектуальных карт, аналог конфлюенса, чего только нет, в том числе есть Task Tracker - Deck.
Установка
Deck на GitHub:
https://github.com/nextcloud/deck
А развернуть Nextcloud можно на виртуальном выделенном сервере, есть официальный Docker image и огромное количество tutorial-ов как это сделать ..
Вот например:
https://zomro.com/rus/blog/faq/302-kak-ustanovit-nextcloud-v-docker
❤🔥8🔥4👀1
Секретный отдых местных в Сочи
Сегодня побывал в месте, где тусят, как мне показалось, исключительно местные. Вы врядли найдете это место на 2гис, яндексе.. При въезде нет никаких вывесок, плакатов...
Я бы никогда туда не попал, если бы не жил в Сочи долгое время и не обзавёлся новыми связями....
Не уверен, что имею право рассказывать, где я отдыхал...
Цена: 300 руб с человека на целый день!
В стоимость входит: мангал, столик на 6 человек с лавочками, есть возможность бесплатно воспользоваться холодильником и даже кинуть себе удлинитель...
На базе есть туалет, раковина с водой, магазинчик с адекватными ценами (кофе 3 в 1 стоит 100 руб, энергетик адреналин 150)
Меня сразу раскусили, что я приезжий и ничего не понимаю в приготовлении шашлыка...Хозяин комплекса был в шоке кого занесло на его базу, но был любезен и помогал мне.
Он дал мне бесплатно 3 банки жидкости для розжига...
Пожалел бедолагу😂
Я пол дня жарил шашык: 2 мешка углей, 5 кг мяса, а ещё были грибы😱😂
В общем и целом все прошло классно, я бы с удовольствием вернулся сюда, но пока ещё мне не скинули номер телефона, по которому надо бронировать...думаю, на согласование этот момент😂
Сегодня побывал в месте, где тусят, как мне показалось, исключительно местные. Вы врядли найдете это место на 2гис, яндексе.. При въезде нет никаких вывесок, плакатов...
Я бы никогда туда не попал, если бы не жил в Сочи долгое время и не обзавёлся новыми связями....
Не уверен, что имею право рассказывать, где я отдыхал...
Цена: 300 руб с человека на целый день!
В стоимость входит: мангал, столик на 6 человек с лавочками, есть возможность бесплатно воспользоваться холодильником и даже кинуть себе удлинитель...
На базе есть туалет, раковина с водой, магазинчик с адекватными ценами (кофе 3 в 1 стоит 100 руб, энергетик адреналин 150)
Меня сразу раскусили, что я приезжий и ничего не понимаю в приготовлении шашлыка...Хозяин комплекса был в шоке кого занесло на его базу, но был любезен и помогал мне.
Он дал мне бесплатно 3 банки жидкости для розжига...
Пожалел бедолагу😂
Я пол дня жарил шашык: 2 мешка углей, 5 кг мяса, а ещё были грибы😱😂
В общем и целом все прошло классно, я бы с удовольствием вернулся сюда, но пока ещё мне не скинули номер телефона, по которому надо бронировать...думаю, на согласование этот момент😂
❤8❤🔥3👍3🔥2
Hilla позволяет быстрее создавать бизнес-приложения — больше не нужно жонглировать эндпойнтами REST или расшифровывать запросы GraphQL.
Hilla объединяет Spring Boot и React, поэтому разработка приложений становится очень быстрой.
Что меня в нём удивило ?
Это возможность из TypeScript-a дергать функции написанные на java..
Например вот так выглядит взаимодействие фронта с бэком
useEffect(() => {
CRMService.findAllContacts().then(setContacts);
}, []);
async function onContactSaved(contact: ContactRecord) {
const saved = await CRMService.save(contact)
if (contact.id) {
setContacts(contacts => contacts.map(current => current.id === saved.id ? saved : current));
} else {
setContacts(contacts => [...contacts, saved]);
}
setSelected(saved);
}
Тут CRMService - это класс на Java помеченный специальной аннотацией, но Hilla анализирует java код и автоматом генерит прослойку для вызова бэка, благодаря чему с точки зрения кода интеграция вообще безшовная (ну а в реальности вызывается http запрос).. не нужно писать модель данных для ответа, она тоже генерится на основе кода на бэке..
Ещё из классных фич - валидация, её можно описать на бэке а она будет отрабатывать и на фронте при заполнении html-формы.
Меня очень вдохновило это видео, час на одном дыхании пролетел : https://www.youtube.com/watch?v=kykdX-cUv1I&list=PLcRrh9hGNalnnotZb0HstGw_GvZBc9xZp
p.s пока нет идей, где бы я мог его применить, но хочется собрать на нём небольшой проект....
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Why we built Hilla: the modern web framework for Java
Does the world really need yet another frontend framework? We believe it does.
With Hilla, you can build enterprise-grade web apps faster by seamlessly combining server-side Java and client-side TypeScript, instead of developing the frontend and backend…
With Hilla, you can build enterprise-grade web apps faster by seamlessly combining server-side Java and client-side TypeScript, instead of developing the frontend and backend…
👍6🔥4🤔2
Nerdctl - как Docker только лучше
Зачем мне это?
По заявлению самих разработчиков этой утилиты...
Цель nerdctl — облегчить экспериментирование с передовыми функциями управления контейнерами, которых нет в Docker, но которые завезут позже в Docker, и то не факт (может только в enterprise версию).
Кроме того, nerdctl может быть потенциально полезен для отладки кластеров Kubernetes, но это не основная цель.
Подробнее об этом инструменте можете почитать в доке на github
Перейдём к практике
Nerdctl обеспечивает CLI идентичный Docker.
Если вы знакомы с CLI docker вы уже знакомы с nerdctl.
Для примера, покажу команду, как используя nerdctl запустить контейнер с nginx
Посмотрим другие команды?
Установка
Самое сложное в деле перехода с docker на nerdctl - это установка. Ну я любезно поделюсь командами для установки на linux.
Установку выполнять необходимо с правами администратора (sudo)
Шаг 1
Для начала установим сам nerdctl, возьмём на текущий момент самую актуальную версию nerdctl из github.
Вы же хотите быть в тренде?😀
Шаг 2
Далее нам нужно установить CNI плагины (Container Networking Interface)
CNI - обеспечивает всё необходимое для стандартизированного управления сетевыми интерфейсами в Linux-контейнерах и гибкого расширения сетевых возможностей.
Тоже берём самую актуальную версию из github
P.s Тут легко нарваться на ситуацию, когда nerdctl не совместим с CNI, например у вас свежий nerdctl, но старый CNI, поэтому следим за версиями...
Те версии, которые я указал, 100% совместимы между собой ✅
Заключение
И ах да, теперь вы можете отрубить Docker и всегда использовать вместо него nerdctl
Некоторые, самые отбитые, делают алиас docker = nerdctl, ну я так не рекомендую, используйте докер, если так хочется, он тоже прекрасен)
Скорее всего, я не убедил попробовать nerdctl, но я рекомендую ознакомится с докой на эту утилиту и возможно какие-то фичи вызовут восторг и вы всё же попробуете...
Дублирую ссылку на доку
Ещё использование/гугление этой темы добавит вам понимание, что под капотом у docker и как он работает ..
P.S Вдохновило меня написать этот пост обучение на онлайн-курсе, я подтягиваю навык "деплой и запуск приложений в контейнерах", далее напишу ещё парочку статей на эту тему 🫡🤗
Зачем мне это?
По заявлению самих разработчиков этой утилиты...
Цель nerdctl — облегчить экспериментирование с передовыми функциями управления контейнерами, которых нет в Docker, но которые завезут позже в Docker, и то не факт (может только в enterprise версию).
Кроме того, nerdctl может быть потенциально полезен для отладки кластеров Kubernetes, но это не основная цель.
Подробнее об этом инструменте можете почитать в доке на github
Перейдём к практике
Nerdctl обеспечивает CLI идентичный Docker.
Если вы знакомы с CLI docker вы уже знакомы с nerdctl.
Для примера, покажу команду, как используя nerdctl запустить контейнер с nginx
nerdctl run -d -p 8080:80 --name nginx-app nginx
Посмотрим другие команды?
nerdctl pull: This downloads a container image from a container registry.
nerdctl run: This starts a new container and runs a command inside it.
nerdctl ps: This lists all running containers.
nerdctl stop: This stops a running container.
nerdctl compose up: This starts all the containers defined in your Docker Compose file.
Установка
Самое сложное в деле перехода с docker на nerdctl - это установка. Ну я любезно поделюсь командами для установки на linux.
Установку выполнять необходимо с правами администратора (sudo)
Шаг 1
Для начала установим сам nerdctl, возьмём на текущий момент самую актуальную версию nerdctl из github.
Вы же хотите быть в тренде?😀
wget https://github.com/containerd/nerdctl/releases/download/v2.0.0-rc.0/nerdctl-full-2.0.0-rc.0-linux-amd64.tar.gz
mkdir nerdctl
tar -xzf nerdctl-full-2.0.0-rc.0-linux-amd64.tar.gz -C ./nerdctl
cp ./nerdctl/bin/nerdctl /usr/bin/
chmod +x /usr/bin/nerdctl
Шаг 2
Далее нам нужно установить CNI плагины (Container Networking Interface)
CNI - обеспечивает всё необходимое для стандартизированного управления сетевыми интерфейсами в Linux-контейнерах и гибкого расширения сетевых возможностей.
Тоже берём самую актуальную версию из github
wget https://github.com/containernetworking/plugins/releases/download/v1.5.1/cni-plugins-linux-amd64-v1.5.1.tgz
mkdir ./CNI
tar xzf cni-plugins-linux-amd64-v1.5.1.tgz -C ./CNI
mkdir -p /opt/cni/bin/
mv ./CNI/* /opt/cni/bin/
P.s Тут легко нарваться на ситуацию, когда nerdctl не совместим с CNI, например у вас свежий nerdctl, но старый CNI, поэтому следим за версиями...
Те версии, которые я указал, 100% совместимы между собой ✅
Заключение
И ах да, теперь вы можете отрубить Docker и всегда использовать вместо него nerdctl
systemctl mask docker
systemctl stop docker
Некоторые, самые отбитые, делают алиас docker = nerdctl, ну я так не рекомендую, используйте докер, если так хочется, он тоже прекрасен)
Скорее всего, я не убедил попробовать nerdctl, но я рекомендую ознакомится с докой на эту утилиту и возможно какие-то фичи вызовут восторг и вы всё же попробуете...
Дублирую ссылку на доку
Ещё использование/гугление этой темы добавит вам понимание, что под капотом у docker и как он работает ..
P.S Вдохновило меня написать этот пост обучение на онлайн-курсе, я подтягиваю навык "деплой и запуск приложений в контейнерах", далее напишу ещё парочку статей на эту тему 🫡🤗
GitHub
GitHub - containerd/nerdctl: contaiNERD CTL - Docker-compatible CLI for containerd, with support for Compose, Rootless, eStargz…
contaiNERD CTL - Docker-compatible CLI for containerd, with support for Compose, Rootless, eStargz, OCIcrypt, IPFS, ... - containerd/nerdctl
🔥5👍3
Оптимальный Docker Image для Spring Boot
В наше время, когда доминирует микросервисная архитектура, контейнеры являются ключевым инструментом для упаковки приложений перед их отправкой в различные среды. Однако, многие разработчики недостаточно задумываются о том, как наиболее эффективно упаковать сервис, чтобы избежать уязвимостей в безопасности.
Перейдем к практике, у меня есть проект todo list на Spring boot и я хочу его запускать в докер контейнере
Ссылка https://github.com/TwoZeros/simple-todo
Простой Dockerfile
Spring Boot использует "Fat JAR" формат упаковки по умолчанию. Это значит, что все зависимости, необходимые для запуска, добавляются в один Jar файл.
В качестве базового образа используем eclipse-temurin:17-jre-alpine - минимальную JRE без всяких инструментов разработки
Итого наш образ весит 212 Мегабайт
Минусы этого способа - нам приходится руками через IDE или cli сначала собрать jar-ник, а потом уже создавать образ
Вариант получше
Можно это оптимизировать - собирать jar файл благодаря инструкциям в Dockerfile
Тут два варианта:
Итог получаем все те же 212 МБ, но уже не нужно помнить про "А я уже делал пересборку?"
В наше время, когда доминирует микросервисная архитектура, контейнеры являются ключевым инструментом для упаковки приложений перед их отправкой в различные среды. Однако, многие разработчики недостаточно задумываются о том, как наиболее эффективно упаковать сервис, чтобы избежать уязвимостей в безопасности.
Перейдем к практике, у меня есть проект todo list на Spring boot и я хочу его запускать в докер контейнере
Ссылка https://github.com/TwoZeros/simple-todo
Простой Dockerfile
FROM eclipse-temurin:17-jre-alpine AS app-run
WORKDIR /opt/build
COPY ./views/target/*.jar ./application.jar
ENTRYPOINT ["java","-jar","./application.jar"]
Spring Boot использует "Fat JAR" формат упаковки по умолчанию. Это значит, что все зависимости, необходимые для запуска, добавляются в один Jar файл.
В качестве базового образа используем eclipse-temurin:17-jre-alpine - минимальную JRE без всяких инструментов разработки
Итого наш образ весит 212 Мегабайт
Минусы этого способа - нам приходится руками через IDE или cli сначала собрать jar-ник, а потом уже создавать образ
mvn clean package
docker build -t simple-todo:0.0.1 -f Dockerfile.simple .
Вариант получше
Можно это оптимизировать - собирать jar файл благодаря инструкциям в Dockerfile
Тут два варианта:
Oтказаться от eclipse-temurin:17-jre-alpine и использовать в качестве базового образа какую-то JDK c maven, но тогда размер image возрастёт в 2 раза (около 400МБ)
Использовать Multi-stage builds на первом шаге создаём артефакт, а на втором его запускаем
# На этот раз нам требуется образ, содержащий maven, при помощи
# ключевого слова as мы указываем псевдоним для контейнера сборки,
# чтобы при его помощи в дальнейшем обращаться к контейнеру
FROM maven:3.9.4-eclipse-temurin-17 AS maven
# Собирать проект будем в /build
WORKDIR /build
# Теперь необходимо скопировать необходимые для сборки проекта файлы в конейнер
COPY ./repository ./repository
COPY ./service ./service
COPY ./views ./views
COPY pom.xml pom.xml
# И запустить сборку проекта. Загружаемые библиотеки желательно кэшировать между
# сборками,для этого нужно добавить --mount=type=cache,target=/root/.m2 к RUN
RUN --mount=type=cache,target=/root/.m2 mvn clean package
FROM eclipse-temurin:17-jre-alpine AS app-run
ENV RELEASE=17
WORKDIR /opt/build
# из stage maven берём jar и помещаем в текущий образ
COPY --from=maven /build/views/target/*.jar ./application.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "application.jar"]
Итог получаем все те же 212 МБ, но уже не нужно помнить про "А я уже делал пересборку?"
GitHub
GitHub - TwoZeros/simple-todo
Contribute to TwoZeros/simple-todo development by creating an account on GitHub.
❤2👍2
Профессиональная оптимизация Docker image с приложением на JAVA
Как ещё оптимизировать размер образа?
Есть вариант, он более сложный, но однозначно стоит его рассмотреть.
Вообще во всём виновата JDK/JRE - Виртуальная машина Java.
Именно она прибавляет значительную часть веса нашему образу с приложением...
Мы можем собрать JRE специально под наше приложение, чтобы урезать её, заточить специально под определенное приложение.
Тем самым уменьшим её размер.
Такую махинацию можно провернуть благодаря утилиты jlink
и ещё одну оптимизацию проведём, распакуем jar архив на слои:
Получим 4 папки:
Для чего мы распаковали JAR?
Чаше всего, от версии к версии приложения меняется только бизнес-логика..
Версии библиотек меняются редко.
Мы можем разбить jar и тот слой, что не поменялся, будет от версии к версии браться из кеша. Вот для этого мы и разбиваем jar.
Есть принцип оптимизации docker image:
И перейдем к итоговому файлу:
Такой вариант уменьшил размер образа на 38 МБ.
Итого image = 174 МБ
Но тут ещё, мы улучшили секьюрность , так как создали специального пользователя для запуска приложения, а не под root работаем...
Все эти файлы с примерами кода есть в репе https://github.com/TwoZeros/simple-todo
Пробуйте, экспериментируйте и ещё можете почитать вот эту статью
Как ещё оптимизировать размер образа?
Есть вариант, он более сложный, но однозначно стоит его рассмотреть.
Вообще во всём виновата JDK/JRE - Виртуальная машина Java.
Именно она прибавляет значительную часть веса нашему образу с приложением...
Мы можем собрать JRE специально под наше приложение, чтобы урезать её, заточить специально под определенное приложение.
Тем самым уменьшим её размер.
Такую махинацию можно провернуть благодаря утилиты jlink
$JAVA_HOME/bin/jlink \
--add-modules `jdeps --ignore-missing-deps -q -recursive --multi-release ${RELEASE} --print-module-deps -cp 'dependencies/BOOT-INF/lib/*':'snapshot-dependencies/BOOT-INF/lib/*' application.jar` \
--strip-debug \
--no-man-pages \
--no-header-files \
--compress=2 \
--output jdk
и ещё одну оптимизацию проведём, распакуем jar архив на слои:
java -Djarmode=layertools -jar ../target/*.jar extract
Получим 4 папки:
application. Здесь лежит код (бизнес-логика).
snapshot-dependencies. Здесь лежат snapshot зависимости.
spring-boot-loader. Здесь лежат запускаторы спринга.
dependencies. Здесь лежат релизные зависимости.
Для чего мы распаковали JAR?
Чаше всего, от версии к версии приложения меняется только бизнес-логика..
Версии библиотек меняются редко.
Мы можем разбить jar и тот слой, что не поменялся, будет от версии к версии браться из кеша. Вот для этого мы и разбиваем jar.
Есть принцип оптимизации docker image:
Всё что меняется наиболее часто должно идти в самом конце
И перейдем к итоговому файлу:
FROM maven:3.9.4-eclipse-temurin-17 AS maven
# Собирать проект будем в /build
WORKDIR /build
COPY ./repository ./repository
COPY ./service ./service
COPY ./views ./views
COPY pom.xml pom.xml
RUN --mount=type=cache,target=/root/.m2 mvn clean package
FROM eclipse-temurin:17 AS app-build
ENV RELEASE=17
WORKDIR /opt/build
COPY --from=maven /build/views/target/*.jar ./application.jar
RUN java -Djarmode=layertools -jar application.jar extract
RUN $JAVA_HOME/bin/jlink \
--add-modules `jdeps --ignore-missing-deps -q -recursive --multi-release ${RELEASE} --print-module-deps -cp 'dependencies/BOOT-INF/lib/*':'snapshot-dependencies/BOOT-INF/lib/*' application.jar` \
--strip-debug \
--no-man-pages \
--no-header-files \
--compress=2 \
--output jdk
FROM debian:buster-slim
ARG BUILD_PATH=/opt/build
ENV JAVA_HOME=/opt/jdk
ENV PATH="${JAVA_HOME}/bin:${PATH}"
RUN groupadd --gid 1000 spring-app \
&& useradd --uid 1000 --gid spring-app --shell /bin/bash --create-home spring-app
USER spring-app:spring-app
WORKDIR /opt/workspace
COPY --from=app-build $BUILD_PATH/jdk $JAVA_HOME
COPY --from=app-build $BUILD_PATH/spring-boot-loader/ ./
COPY --from=app-build $BUILD_PATH/dependencies/ ./
COPY --from=app-build $BUILD_PATH/snapshot-dependencies/ ./
COPY --from=app-build $BUILD_PATH/application/ ./
EXPOSE 8080
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
Такой вариант уменьшил размер образа на 38 МБ.
Итого image = 174 МБ
Но тут ещё, мы улучшили секьюрность , так как создали специального пользователя для запуска приложения, а не под root работаем...
Все эти файлы с примерами кода есть в репе https://github.com/TwoZeros/simple-todo
Пробуйте, экспериментируйте и ещё можете почитать вот эту статью
GitHub
GitHub - TwoZeros/simple-todo
Contribute to TwoZeros/simple-todo development by creating an account on GitHub.
👍3❤2
Не будь лузером - используй USER в Dockerfile
Команда USER в Dockerfile – это основополагающий инструмент, определяющий, под каким пользователем будут выполняться команды как в процессе сборки образа, так и при запуске контейнера. По умолчанию, если USER не указан, Docker будет выполнять команды от имени пользователя root, что может представлять серьезную угрозу безопасности.
Практика
Cоздадим Dockerfile со следующим содержимым:
Далее соберём контейнер:
И запустим его:
Попробуем выполнить следующее внутри контейнера:
И закономерно получим ошибку "Доступ запрещён", так как созданный нами пользователь не имеет root доступа.
Как собирать образ без root?
Eсли вам нужно установить какой-то доп софт в контейнере, сделать что-то, где нужны привилегии супер пользователя, то конечно нужен root, но как всё необходимое под root сделаете - переключайтесь на другого обычного пользака
P.s будет просто идеально если такого пользака нет на вашей основной ОС, где запущен docker
Почему это важно?
По умолчанию контейнеры Docker работают с UID 0 или root.
Процессы докера запускаются и работают в хостовой ОС.
Если Docker-контейнер будет скомпрометирован, в лучшем случае злоумышленник получит полный доступ к ресурсам хоста, выделенным для этого контейнера и запустит какие-то команды, свои скрипты в этом контейнере... В самом плохом случае, сможет получить доступ к ресурсам хостовой ОС, то есть выйти за пределы контейнера, хотя этот кейс проблематичен так как есть механизм управления привилегиями, который это запрещает по умолчанию.. Нам остаётся только наедятся, что он идеален и в нём нет никаких дыр..
Но можно запустить контейнер с флагом --privileged и контейнер получит полный доступ к ресурсу хоста, тут и хакером быть не нужно, чтоб натворить всяких дел, поэтому старайтесь не запускать контейнеры с этим флагом...
Вообще, это только 30% инфы на тему тему,продолжение в моём платном телеграмм канале, где вся база как стать успешным.
Рекомендую почитать эту статью чтобы узнать больше:
https://www.docker.com/blog/understanding-the-docker-user-instruction/
Мой факап на тему безопасности Docker
Когда я только начал изучать докер и мне попалась на глаза зарубежная статья, где контейнер запускался с флагом --privileged, я подумал ВАУ, это определенно что-то не обычное...
Я побежал запускать контейнер с этим флагом, я думал это способ респектнуть запускаемый контейнер, сообщить докеру, что он важен для меня...docker demon будет всячески оберегать его и не будет допускать reload..😂
Я очень расстроился, когда не увидел никакой разницы...Docker не написал, что как-то особо позаботится о нём..
Я пошел разбираться, что значит --privileged и был шокирован, что это вообще про другое..
Надо читать документацию, а не включать интуицию😁
Команда USER в Dockerfile – это основополагающий инструмент, определяющий, под каким пользователем будут выполняться команды как в процессе сборки образа, так и при запуске контейнера. По умолчанию, если USER не указан, Docker будет выполнять команды от имени пользователя root, что может представлять серьезную угрозу безопасности.
Практика
Cоздадим Dockerfile со следующим содержимым:
FROM ubuntu:20.04
#Задаём переменные для сборки образа
ARG USER_NAME=noob \
USER_GROUP=noob
# Создаём пользователя
RUN groupadd -g 1234 ${USER_GROUP} && \
useradd -m -u 1234 -g ${USER_GROUP} ${USER_NAME}
#Переключаемся на созданного пользователя
USER ${USER_NAME}
# Устанавливаем рабочую директорию
WORKDIR /home/${USER_NAME}
CMD sh -c "echo 'Внутри контейнера:' && echo 'Пользователь: $(whoami) UID: $(id -u) GID: $(id -g)'"
Далее соберём контейнер:
docker build -t ubuntu-t .
И запустим его:
docker run --rm -it ubuntu-t /bin/bash
Попробуем выполнить следующее внутри контейнера:
apt-get update
И закономерно получим ошибку "Доступ запрещён", так как созданный нами пользователь не имеет root доступа.
Как собирать образ без root?
Eсли вам нужно установить какой-то доп софт в контейнере, сделать что-то, где нужны привилегии супер пользователя, то конечно нужен root, но как всё необходимое под root сделаете - переключайтесь на другого обычного пользака
#Переключаемся на созданного пользователя
USER ${USER_NAME}
P.s будет просто идеально если такого пользака нет на вашей основной ОС, где запущен docker
Почему это важно?
По умолчанию контейнеры Docker работают с UID 0 или root.
Процессы докера запускаются и работают в хостовой ОС.
Если Docker-контейнер будет скомпрометирован, в лучшем случае злоумышленник получит полный доступ к ресурсам хоста, выделенным для этого контейнера и запустит какие-то команды, свои скрипты в этом контейнере... В самом плохом случае, сможет получить доступ к ресурсам хостовой ОС, то есть выйти за пределы контейнера, хотя этот кейс проблематичен так как есть механизм управления привилегиями, который это запрещает по умолчанию.. Нам остаётся только наедятся, что он идеален и в нём нет никаких дыр..
Но можно запустить контейнер с флагом --privileged и контейнер получит полный доступ к ресурсу хоста, тут и хакером быть не нужно, чтоб натворить всяких дел, поэтому старайтесь не запускать контейнеры с этим флагом...
Вообще, это только 30% инфы на тему тему,
Рекомендую почитать эту статью чтобы узнать больше:
https://www.docker.com/blog/understanding-the-docker-user-instruction/
Мой факап на тему безопасности Docker
Когда я только начал изучать докер и мне попалась на глаза зарубежная статья, где контейнер запускался с флагом --privileged, я подумал ВАУ, это определенно что-то не обычное...
Я побежал запускать контейнер с этим флагом, я думал это способ респектнуть запускаемый контейнер, сообщить докеру, что он важен для меня...docker demon будет всячески оберегать его и не будет допускать reload..😂
Я очень расстроился, когда не увидел никакой разницы...Docker не написал, что как-то особо позаботится о нём..
Я пошел разбираться, что значит --privileged и был шокирован, что это вообще про другое..
Надо читать документацию, а не включать интуицию😁
Docker Documentation
Running containers
Running and configuring containers with the Docker CLI
❤4👍4👌2
Быстрая установка Docker и немного про Rootless
Установить Docker можно запустив bash скрипт.
Установка максимально простая и мне лично этот способ уже успел понравится.
1.Скачиваем скрипт
2. Выводим содержимое скрипта на экран, смотрим на то, что мы собственно скачали
3. Запускаем скрпит с --dry-run чтобы проверить шаги которые будут выполнены
4. Запускаем скрипт уставки под root или с sudo
Автоматом получим последнюю свежую версию,
С документацией и самим скриптом можно ознакомится перейдя по ссылке https://get.docker.com
Про Docker Rootless слышали?
Docker можно использовать в режиме Rootless - это когда вам не нужен root (sudo) для работы с Docker.
Установка отличается от обычной, но не сказал бы что это сложно.
Это появилось в Docker 4 года назад, но узнал я об этом способе работы совсем недавно, когда основательно начал изучать возможности Docker. Кажется, что это не сильно распространено, об этом не рассказывают в видео "Docker за 20 минут"
Плюсы Docker в Rootless:
1) Перове и самое главное - безопасность. Вы можете случайно или преднамеренно запустить контейнер в привилегированном режиме , но из контейнера никак не сможете навредить основной ОС, так как процесс запущен от обычного user без root, а этот user без root мало на что способен...
2) Если у вас VDS/VPS и вы хотите кому-то из друзей, стажеров, студентов, итд итп дать возможность использовать ресурсы вашего сервера, чтоб он смог поднимать контейнеры в Docker... настраиваем Docker c Rootless и спим спокойно, так как такому пользаку root доступ к серверу можно уже не давать.
3) удобство не нужно постоянно переключатся между root и обычным пользователем...
Ссылка на доку: https://docs.docker.com/engine/security/rootless/
А вы работали с Docker в режиме Rootless?
Установить Docker можно запустив bash скрипт.
Установка максимально простая и мне лично этот способ уже успел понравится.
1.Скачиваем скрипт
curl -fsSL https://get.docker.com -o install-docker.sh
2. Выводим содержимое скрипта на экран, смотрим на то, что мы собственно скачали
cat install-docker.sh
3. Запускаем скрпит с --dry-run чтобы проверить шаги которые будут выполнены
sh install-docker.sh --dry-run
4. Запускаем скрипт уставки под root или с sudo
sudo sh install-docker.sh
Автоматом получим последнюю свежую версию,
С документацией и самим скриптом можно ознакомится перейдя по ссылке https://get.docker.com
Про Docker Rootless слышали?
Docker можно использовать в режиме Rootless - это когда вам не нужен root (sudo) для работы с Docker.
Установка отличается от обычной, но не сказал бы что это сложно.
Это появилось в Docker 4 года назад, но узнал я об этом способе работы совсем недавно, когда основательно начал изучать возможности Docker. Кажется, что это не сильно распространено, об этом не рассказывают в видео "Docker за 20 минут"
Плюсы Docker в Rootless:
1) Перове и самое главное - безопасность. Вы можете случайно или преднамеренно запустить контейнер в привилегированном режиме , но из контейнера никак не сможете навредить основной ОС, так как процесс запущен от обычного user без root, а этот user без root мало на что способен...
2) Если у вас VDS/VPS и вы хотите кому-то из друзей, стажеров, студентов, итд итп дать возможность использовать ресурсы вашего сервера, чтоб он смог поднимать контейнеры в Docker... настраиваем Docker c Rootless и спим спокойно, так как такому пользаку root доступ к серверу можно уже не давать.
3) удобство не нужно постоянно переключатся между root и обычным пользователем...
Ссылка на доку: https://docs.docker.com/engine/security/rootless/
А вы работали с Docker в режиме Rootless?
Docker Documentation
Rootless mode
Run the Docker daemon as a non-root user (Rootless mode)
👍3
Attation мидлы, сеньоры и сеньориты!
Начинает холодать, уже и в Сочи чувствуется наступление осени.
Летом легко корректировать поддерживать свой вес, что не скажешь про осень и зиму..
Мы айтишники не медведи, сейчас этап, когда нужно поднять приоритет задачи по поддержанию собственной физухи.
Может запустим челендж на спортивную тематику или вы меня пригласите в какой-то? Я открыт к идеям, пишите их в комменты🙏
Пока, у меня план такой: поставить цель по SMART насчёт физухи и вести дневник тренировок. Может сделаю это прям тут, просто какой-то отдельный топик создам или спец приложение найду...
Развитие в разработке и в IT - невозможно без поддержки веса и здорового образа жизни 🤝
Начинает холодать, уже и в Сочи чувствуется наступление осени.
Летом легко корректировать поддерживать свой вес, что не скажешь про осень и зиму..
Мы айтишники не медведи, сейчас этап, когда нужно поднять приоритет задачи по поддержанию собственной физухи.
Может запустим челендж на спортивную тематику или вы меня пригласите в какой-то? Я открыт к идеям, пишите их в комменты🙏
Пока, у меня план такой: поставить цель по SMART насчёт физухи и вести дневник тренировок. Может сделаю это прям тут, просто какой-то отдельный топик создам или спец приложение найду...
Развитие в разработке и в IT - невозможно без поддержки веса и здорового образа жизни 🤝
🔥5⚡3🫡2👍1