Я изо всех сил пытался понять, как упаковать наше приложение, чтобы мы могли запустить несколько команд в одном Docker образе.
Наша установка
bootstrap/Main
является точкой входа picocli , которая регистрирует другие команды, например HttpServer
, CliCommandOne
, CliCommandTwo
и т. Д. c. Эти команды могут быть определены в других модулях / пакетах. Приложение упаковано как JAR с плагином Gradle. По умолчанию без параметров будет использоваться команда HttpServer
. Это возможно, потому что в команде HttpServer
мы можем явно запустить HTTP-сервер (сейчас мы используем https://jooby.io/ framework).
Образ Docker развернут на k8s , Итак, у нас запущен сервер, и в то же время мы можем exec
войти в контейнер и запустить другую команду CLI.
Проблема
Мы хотим переключиться на другую структуру, например, Quarkus, Micronaut или Spring. И похоже, что эти инфраструктуры позволяют вам запускать HTTP-сервер (или WebSocket) или создавать команду CLI, но нет способа скопировать то, что у нас есть сейчас, то есть упаковать несколько команд в один JAR и иметь возможность запускать их в one Docker image.
Решения, о которых мы думали
Что я могу придумать, так это подход, который использует Кафка: у них есть один JAR, насколько я понять, а затем использовать множество sh
сценариев (https://github.com/apache/kafka/tree/trunk/bin) для запуска различных классов https://github.com/apache/kafka/blob/trunk/bin/kafka-run-class.sh. Это кажется нам слишком индивидуальным.
Конечно, мы можем сгенерировать отдельные JAR-файлы для каждого класса с помощью метода main
, а затем создать различные Docker образы и каким-то образом найти способ их запуска. Но это похоже на накладные расходы с точки зрения Docker изображений. Что если нам понадобится 20 команд?
Поэтому я ищу способ упаковки приложения, чтобы иметь несколько исполняемых «команд». Я даже не уверен, хорошая ли это идея. Был бы рад услышать о возможных вариантах или лучших практиках.