Итак, у меня есть несколько приложений Spring Boot, которые используют Liquibase для управления изменениями схемы БД и развертываются в относительно простых контейнерах на базе Ubuntu.
Сейчас приложения поставляются с двумя контейнерами - один образ initContainer, который представляет собой Ubuntu+JDK+Maven на одном уровне, весь исходный код и MAVEN_HOME на втором уровне и запускает mvn liquibase:update, и одно приложение image это Ubuntu+JRE и запускает java -jar /app/app.jar с параметром Spring.liquibase.enabled=false в файле application.properties. Пока все хорошо, но с этим подходом есть две проблемы:
контейнеры инициализации неоправданно огромны (из всего репозитория Maven + метаданных, которые включает в себя кучу вещей, необходимых только во время компиляции и тестирования, а также поставку полного JDK вместо только JRE), содержит исходный код и, поскольку Maven тупой, также проверяет все зависимости, если они все еще актуальны.< /p>
Мне нужно настроить учетные данные базы данных в диаграмме Helm, чтобы Maven мог их получить. Вероятно, мне это сошло бы с рук, записав их в какой-нибудь объект Secret, который вводит переменные среды, но мне все равно приходится иметь дело с двумя разными способами экранирования пароля базы данных.
initContainer запускается при запуске каждого модуля, когда я развертываю программное обеспечение или масштабирую серверные реплики.
Есть ли более чистый способ сделать это? Я бы предположил что-то вроде:
использование только одного контейнера приложения и для приложения, и для initContainer, но с использованием некоторого параметра в initContainers для запуска только Liquibase. Я попытался отключить Spring.main.web-application-type, но, к сожалению, мне не удалось предотвратить запуск таких вещей, как Redis, ElasticSearch или Swagger, с помощью Spring Boot.
< /li>
Использовать какой-нибудь крючок жизненного цикла Kubernetes для развертывания, создавая модули, чтобы при развертывании приложения Liquibase запускалась только один раз для срок действия развертывания (поэтому он не работает в каждом масштабе контейнера), но мне не удалось заставить это работать.
Есть ли какая-либо «лучшая практика» для современных версий Spring Boot, которая достигает моих целей? Все руководства в сети, кажется, отвечают только на вопрос «как отключить Liquibase во время запуска», но ни одно из тех, что я нашел до сих пор, не дает «запустить только Liquibase, а затем выйти без кода ошибки».
Итак, у меня есть несколько приложений Spring Boot, которые используют Liquibase для управления изменениями схемы БД и развертываются в относительно простых контейнерах на базе Ubuntu. Сейчас приложения поставляются с двумя контейнерами - один образ initContainer, который представляет собой Ubuntu+JDK+Maven на одном уровне, весь исходный код и MAVEN_HOME на втором уровне и запускает mvn liquibase:update, и одно приложение image это Ubuntu+JRE и запускает java -jar /app/app.jar с параметром Spring.liquibase.enabled=false в файле application.properties. Пока все хорошо, но с этим подходом есть две проблемы: [list] [*]контейнеры инициализации неоправданно огромны (из всего репозитория Maven + метаданных, которые включает в себя кучу вещей, необходимых только во время компиляции и тестирования, а также поставку полного JDK вместо только JRE), содержит исходный код и, поскольку Maven тупой, также проверяет все зависимости, если они все еще актуальны.< /p>
[*]Мне нужно настроить учетные данные базы данных в диаграмме Helm, чтобы Maven мог их получить. Вероятно, мне это сошло бы с рук, записав их в какой-нибудь объект Secret, который вводит переменные среды, но мне все равно приходится иметь дело с двумя разными способами экранирования пароля базы данных.
initContainer запускается при запуске каждого модуля, когда я развертываю программное обеспечение или масштабирую серверные реплики.
[/list] Есть ли более чистый способ сделать это? Я бы предположил что-то вроде: [list] [*]использование только одного контейнера приложения и для приложения, и для initContainer, но с использованием некоторого параметра в initContainers для запуска только Liquibase. Я попытался отключить Spring.main.web-application-type, но, к сожалению, мне не удалось предотвратить запуск таких вещей, как Redis, ElasticSearch или Swagger, с помощью Spring Boot. < /li> Использовать какой-нибудь крючок жизненного цикла Kubernetes для развертывания, создавая модули, чтобы при развертывании приложения Liquibase запускалась только один раз для срок действия развертывания (поэтому он не работает в каждом масштабе контейнера), но мне не удалось заставить это работать.
[/list] Есть ли какая-либо «лучшая практика» для современных версий Spring Boot, которая достигает моих целей? Все руководства в сети, кажется, отвечают только на вопрос «как отключить Liquibase во время запуска», но ни одно из тех, что я нашел до сих пор, не дает «запустить только Liquibase, а затем выйти без кода ошибки».