Почему файл .war, созданный в образе docker, не работает в браузере? (Java -Сервлеты, Tomcat, Docker) - PullRequest
0 голосов
/ 10 июля 2020

Задача состоит в том, чтобы создать и развернуть простое веб-приложение 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. Почему это не работает?

1 Ответ

0 голосов
/ 10 июля 2020

Ваша Docker команда неверна во многих отношениях. Когда вы выполняете:

CMD ["cd /usr/local/tomcat/webapps/ROOT","jar -cvf ROOT.war ."]

Команда CMD на самом деле является CMD ["исполняемый файл," param1 "," param2 "]

Команда cd проигнорирует оставшиеся аргументы, поэтому пока он делает cd, больше ничего не делает.

Кроме того, вы используете флаг c в своей команде jar. Он предназначен для создания, а не извлечения. Используйте x параметр для извлечения.

Но Tomcat не требует, чтобы вы извлекали файл .war - он сделает это при запуске. Так что вам действительно нужно только:

COPY /ROOT /usr/local/tomcat/webapps/ROOT

CMD ["/usr/local/tomcat/bin/startup.sh"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...