Невозможно запустить файл войны весенней загрузки из контейнера Tomcat

Я использую официальную последнюю версию докера Tomcat image. Я создал файл Docker, чтобы использовать этот образ Tomcat и развернуть файлы войны непосредственно в веб-приложениях Tomcat. Когда я запускаю этот образ докера для запуска контейнера, приложение весенней загрузки не запускается, поскольку я не вижу журналов запуска приложений. Тот же файл войны при развертывании на локальном сервере Tomcat работает нормально, но только когда я использую sudo для запуска команды catalina.sh run.

Вот файл докера, который я использовал:

##### Use the official Tomcat base image
FROM tomcat:latest

##### Env variable for log path
ENV LOG_PATH=/usr/local/tomcat/logs


##### Copy the WAR file into the webapps directory
COPY service-2.1.6.war /usr/local/tomcat/webapps/

##### Create necessary directories for Tomcat web applications
RUN mv /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps/

##### Set the environment variable for the active Spring profile
#####ENV SPRING_PROFILES_ACTIVE=prod

##### Copy the tomcat-users.xml file to configure the manager users
COPY tomcat-users.xml /usr/local/tomcat/conf/tomcat-users.xml
COPY context.xml /usr/local/tomcat/webapps/manager/META-INF/context.xml

#####Install sudo
RUN apt-get update && apt-get install -y sudo

##### Start Tomcat with sudo
#####CMD ["sudo", "/usr/local/tomcat/bin/catalina.sh", "run"]

Журналы запуска Tomcat из докер-контейнера:

Журналы запуска Tomcat из локальной установки Tomcat:

Что здесь может быть не так или чего-то не хватает?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

ОБНОВЛЯТЬ

Потому что у тебя весенняя загрузка 2.4.5.

Докерфайл

FROM tomcat:9.0.90-jdk11-temurin-jammy

COPY helloworld.war /usr/local/tomcat/webapps/helloworld.war

EXPOSE 8080

ENTRYPOINT []

CMD ["catalina.sh", "run"]

НЕ ИСПОЛЬЗУЙТЕ tomcat:latest


Старый ответ

Весенняя загрузка 3.3.x

Докерфайл

FROM tomcat:10.1.25-jdk17-temurin-jammy

COPY service-2.1.6.war /usr/local/tomcat/webapps/service-2.1.6.war

EXPOSE 8080

ENTRYPOINT []

CMD ["catalina.sh", "run"]
  • (1) Не устанавливать sudo
RUN apt-get update && apt-get install -y sudo
  • (2) Не используйте sudo для запуска tomcat, поскольку по умолчанию контейнер выполняет его под учетной записью root.
CMD ["sudo", "/usr/local/tomcat/bin/catalina.sh", "run"]
  • (3) перейдите к «https://hub.docker.com/_/tomcat»
  • (4) найдите раздел Supported tags and respective Dockerfile links -> 10.1.25-jdk21-temurin-jammy
  • (5) нажмите на ссылку 10.1.25-jdk21-temurin-jammy
  • (6) откроется «https://github.com/docker-library/tomcat/blob/3f32851578fdc88622b6dd24c83fef4195249c2d/10.1/jdk21/temurin-jammy/Dockerfile»
  • (7) Найдите нижнюю часть файла.

Строка 144 ~ Строка 149

EXPOSE 8080

ENTRYPOINT []

CMD ["catalina.sh", "run"]

(8) Скопируйте содержимое здесь в свой файл докеров.

Создание образа докера

docker build -t docker-helloworld:0.0.1 .
       
docker tag docker-helloworld:0.0.1 docker-helloworld:latest

Запустить образ докера

docker run -it --rm -p 8080:8080 docker-helloworld

Я выполнил вышеуказанные шаги, но проблема осталась прежней. Я обновил вопрос с помощью журналов Catalina, которые распечатываются при запуске.

Abhilash 29.06.2024 06:03

@Abhilash — проверьте среду хоста, версию Tomcat, версию JDK. Разница между версией Tomcat и версией JDK контейнера Tomcat, которую вы используете. Вы используете Spring Boot 2.4.5. Пожалуйста, подтвердите версию JDK, которую вы используете (разница между Host и Container). Моя война Spring Boot использует Spring Boot 3.3.0, JDK 17.

life888888 29.06.2024 09:13

@Abhilash — измените файл Dockerfile, FROM tomcat:latest -> FROM tomcat:9.0.90-jdk11-temurin-jammy, Spring Boot 2.4.5 + Tomcat 9.0 + JDK 11.

life888888 29.06.2024 09:39

Изображение tomcat:latest: JDK — 21.0.3, версия Tomcat — 10.1.25. Я предполагаю, что Spring Boot 2.4.5 с Tomcat 10.1 + JDK 21 может быть несовместим.

life888888 29.06.2024 09:42

У меня есть Spring Boot версии 2.4.5, созданный с использованием jdk17, а версия моего хоста Tomcat была 8.5.98. Теперь, когда я использовал ту же версию изображения tomcat, а именно 8.5.98-jre17-temurin, приложение начало работать. Не знаю, в чем была проблема с более ранними версиями.

Abhilash 29.06.2024 10:36

Единственная информация, предоставленная в начале вопроса: (1) Spring Boot War, (2) Tomcat, (3) tomcat:latest упомянуто в Docker. Кроме того, версия, используемая Spring Boot, и версия, используемая версией JDK, Host Tomcat и версия, используемая JDK, не содержали описания в вопросе. Только после того, как я дал ответ и предоставил картинку, я увидел по картинке, что версия Spring Boot — 2.4.5. Кроме этого, так называемая версия Local Tomcat и версия JDK проблем не вызывают, но соответствующей информации по-прежнему нет.

life888888 29.06.2024 11:27

Другими словами, все описание проблемы говорит вам только о том, что Spring Boot 2.4.5 и образ используют tomcat:latest, и нет никакой более подробной информации, кроме этой.

life888888 29.06.2024 11:27
Ответ принят как подходящий
  1. Проблема заключалась в базовом образе Tomcat, используемом для запуска контейнера. В моем приложении Spring Boot использовалась версия Spring Boot 2.4.5, ​​созданная с использованием версии jdk17, а я использовал образ tomcat:latest, использующий jdk21.
  2. Ключевым моментом здесь является наличие той же версии jdk, которая использовалась для сборки файла war и tomcat.
  3. Вы можете проверить, какую версию JDK использует изображение tomcat, проверив сведения о его слое и определив версию JDK, как показано на изображении ниже. Я исправил свою проблему, используя образ Tomcat, поддерживающий JDK17, который в моем случае был 8.5.98-jre17-temurin.
  4. Мне также удалось запустить его с помощью 9.0.90-jre17-temurin-jammy, поскольку здесь также использовался JDK17.

Другие вопросы по теме