Задача состоит в том, чтобы создать и развернуть простое веб-приложение Hello World с Java и Docker. Он должен распечатать Hello World! при вводе IP-адреса и порта сервера в браузере. Я уже заставил его работать на localhost и на сервере со следующими кодами:
На localhost я создаю новую папку в каталоге «webapps» под названием «ROOT». Я обмениваю его с исходным каталогом "ROOT" от Tomcat. На localhost у меня есть только папка «WEB-INF», а в папке «WEB-INF» находятся мой файл «web. xml» и папка «классы». В папке «классы» находятся файлы «HelloWorld. java» и «HelloWorld.class».
apache -tomcat-9.0.36 / webapps / ROOT / WEB-INF / web. xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>SimpleTryOutApplication</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SimpleTryOutApplication</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
apache -tomcat-9.0.36 / webapps / ROOT / WEB-INF / classes / HelloWorld. java:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
PrintWriter out = response.getWriter();
out.println("Hello World!");
}
}
Когда я набираю localhost: 8080 в браузере после того, как я запустил tomcat в cmd, все работает нормально. Я получаю свой Hello World!.
Теперь, когда я создаю файл .war моей папки «ROOT» на моем локальном компьютере, а затем помещаю весь каталог «ROOT» со своего локального компьютера на сервере с FileZilla (файл ROOT .war находится в том же месте, что и каталог «WEB-INF» в каталоге «ROOT»), я создаю изображение docker, которое выглядит следующим образом:
From tomcat:9.0
Run rm -rf /usr/local/tomcat/webapps/ROOT
ADD /ROOT /usr/local/tomcat/webapps/
CMD ["catalina.sh","run"]
Я просто удаляю исходную папку «ROOT» из tomcat в образе и заменяю ее своей собственной, где находится файл ROOT .war. Затем я создаю образ и запустите его с помощью:
docker run -p 0.0.0.0:8888:8080
И все работает нормально, все работает, когда я набираю IP-адрес сервера в моем браузере, я получаю Hello World!.
Но теперь проблема в том, что я не хочу всегда создавать файл .war на моем локальном компьютере, поэтому я хочу создавать его сразу после сборки образа docker. Поэтому я удалил файл «ROOT .war» из каталога «ROOT» на сервере и создал новый файл Docker:
From tomcat:9.0
Run rm -rf /usr/local/tomcat/webapps/ROOT
ADD /ROOT /usr/local/tomcat/webapps/
WORKDIR /usr/local/tomcat/webapps/ROOT
Run jar -cvf ROOT.war .
CMD ["catalina.sh","run"]
OR
From tomcat:9.0
Run rm -rf /usr/local/tomcat/webapps/ROOT
ADD /ROOT /usr/local/tomcat/webapps
CMD ["cd /usr/local/tomcat/webapps/ROOT","jar -cvf ROOT.war ."]
CMD ["catalina.sh","run"]
In оба варианта, которые я пробовал, образ и файл .war были созданы и запущены без проблем, но внезапно, когда я ввожу IP-адрес сервера в моем браузере, я просто получаю сообщение об ошибке 404 и описание:
404
Message: The requested resource [/] is not available
Description: The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.
Я не знаю, что происходит. Единственная разница в основном в том, что когда это работало, я создал файл .war локально и вручную поместил его на сервер в папку «ROOT» и добавил всю папку «ROOT» в папку «webapps» в папке docker изображение. И со второй попытки я просто создал точно такой же файл «ROOT .war» в той же папке, но в образе docker. Почему это не работает?