Запустите скрипт после запуска tomcat при запуске k8s pod - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь запустить скрипт начальной загрузки pod (который в основном запускает программу java) после запуска tomcat в модуле. Мой модуль запускает один контейнер на основе кота. Вот фрагмент, над которым я работаю и перерабатываю:

     - image: myreg/mydir/myimg:local
       name: tomcat-adminapp
       command: ["/bin/sh"]
       args: ["-c", "$CATALINA_HOME/bin/startup.sh && /scripts/runUpg.sh"]

runUpg. sh script:

#!/bin/sh
ls -l $CATALINA_HOME/webapps/app/WEB-INF/lib/
chmod 755 $CATALINA_HOME/webapps/app/WEB-INF/lib/*
java -classpath "$CATALINA_HOME/webapps/app/WEB-INF/lib/*" com.myclass.Upg <args> 
tail -f /dev/nul

Запускается tomcat, но выполнение моего скрипта завершается неудачно. Когда я запускаю c в модуль, я вижу, что война взорвалась, CATALINA_HOME установлен и процесс tomcat запущен. Но я вижу следующие ошибки скрипта в логах kubectl:

ls: невозможно получить доступ '/ userhome / tomcat / webapps / app / WEB-INF / lib /': нет такого файла или каталога, chmod: не может получить доступ '/ userhome / tomcat / webapps / app / WEB-INF / lib / *': нет такого файла или каталога Ошибка: не удалось найти или загрузить основной класс com.myclass.Upg Причина: java .lang.ClassNotFoundException: com .myclass.Upg

Из-за ошибки я предполагаю, что сценарий оболочки может не ждать, пока tomcat завершит sh своего запуска. Я не уверен, почему ..

Когда я запускаю скрипт изнутри модуля, он работает нормально.

Любые указатели здесь приветствуются ..

Обновление: Я подтвердил, что это действительно проблема времени. Когда я использую $CATALINA_HOME/bin/startup.sh && sleep 60 && /scripts/runUpg.sh, сценарий работает нормально. Но я думаю, что это взломан sh и не является правильным способом для вызова класса в веб-приложении.

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Считайте, что postStart перехватывает выполнение скрипта после запуска контейнера.

образец ссылки


apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
1 голос
/ 20 января 2020

Некоторые вещи кажутся мне «подозрительными»:

  1. /userhome/tomcate/webapps/app/WEB-INF/lib - не должно ли это быть /user/home? (это просто примечание, я полагаю, вы правильно его определили)

  2. Реальная проблема. Я не помню, как именно определяются сценарии tomcat, но без kubernetes вы можете попробовать запустить сценарий запуска tomcat и сразу запустить что-то вроде ls в папке lib. Вероятность того, что папка действительно не будет существовать, и вот почему (в моем понимании, опять же):

Tomcat (как отдельный процесс) был написан так, что он будет работать «всегда», но в некоторые моменты времени вы можете поместить «WAR» в папку webapps, и она извлечет WAR и запустит appliction. Тогда вы могли бы позже снова начать новую войну и так далее. Другими словами, жизненный цикл Tomcat как процесса не привязан к жизненному циклу приложения

Предполагается, что процесс запуска самого tomcat считывает конфигурации, создает HTTP-соединитель для прослушивания на порту 8080 или что-то еще, и после этого сценарий выполняется, tomcat запускается.

С точки зрения решения:

Не полагайтесь на tomcat для создания пути к классам ваш процесс для вас, это просто неправильно. Вместо этого вы можете:

  1. Обернуть ваш процесс в WAR, чтобы tomcat также управлял им, и снова он может обслуживать множество WAR, а не один
  2. Создать контейнер с коляской для вашего приложения , так что 2 контейнера будут работать в капсуле бок о бок. Это кубернетский способ ведения дел и, возможно, лучшее решение. В любом случае процесс com.myclass.Upg должен быть автономным (то есть содержать собственные зависимости).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...