当前位置: 首页 > 知识库问答 >
问题:

为什么在docker映像中创建的.war文件在浏览器中不起作用?(Java-Servlets、Tomcat、Docker)

苏季同
2023-03-14

任务是用Java和Docker构建并部署一个简单的Hello World-Web-应用程序。它应该打印出一个你好的世界!在浏览器中输入IP地址和服务器端口时。我已经在localhost和服务器上使用了以下代码:

在localhost上,我正在“webapps”目录中创建一个名为“root”的新文件夹。我正在与Tomcat的原始“root”目录交换它。在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/类/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!");

    }

}

当我在cmd中启动tomcat后,在浏览器中输入localhost:8080时,一切正常。我要得到我的你好世界!

现在,当我在本地计算机上创建一个“root”文件夹的.war文件,然后用FileZilla将本地计算机上的整个“root”目录放到服务器上(root.war文件与“root”目录中的“web-inf”目录位于同一位置)时,我创建了一个docker映像,如下所示:

From tomcat:9.0

Run rm -rf /usr/local/tomcat/webapps/ROOT

ADD /ROOT /usr/local/tomcat/webapps/

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

我基本上只是从图像中的tomcat中删除原始的“root”文件夹,并将其替换为root.war文件所在的地方。然后构建映像并运行它:

docker run -p 0.0.0.0:8888:8080

当我在浏览器中输入服务器的IP地址时,我就会得到Hello World!

但现在的问题是,我不想总是在本地计算机上创建.war文件,所以我想在构建docker映像时创建它。所以我从服务器上的“root”目录中删除了“root.war”文件,并创建了一个新的DockerFile:

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"]

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"]

在我尝试的两个选项中,映像和.war文件都没有问题地构建和运行,但突然间,当我在浏览器中输入服务器的IP-adress时,我只得到一条错误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”文件夹添加到docker映像中的“webapps”文件夹中。在第二次尝试中,我在同一个文件夹中创建了完全相同的“root.war”文件,但在docker映像中。为什么这不起作用?

共有1个答案

訾淇
2023-03-14

您的Docker命令在多个方面都是错误的。当您执行以下操作时:

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

CMD命令实际上是CMD[“executable,”param1“,”param2“]

cd命令将忽略剩余的参数,因此在执行cd时,它不会执行任何其他操作。

此外,您还在jar命令中使用了c标志。这是创造,不是提取。使用x参数提取。

但是Tomcat不需要解压缩.war文件-它会在启动时这样做。所以你真的只需要:

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

CMD ["/usr/local/tomcat/bin/startup.sh"]
 类似资料:
  • 问题内容: 我尝试在Firefox 15上使用,即使它在其他版本的Firefox和其他浏览器(例如Chrome和Safari)上也无法使用。 当我使用Firefox的检查器查看属性时,将被删除并显示错误“无效的属性值”。MDN和caniuse表示Firefox 4及更高版本支持该功能! 怎么会有时性能喜欢和一些浏览器的工作和在其他无效? 免责声明 :这是所有问题的规范重复,可通过添加供应商前缀来完

  • 我正在尝试部署一个java api,它基本上带有。docker容器中的war fie inside/tomcat/webapps/directory。我能够复制这本书。位于其中的Artifactory中的war文件。现在docker容器中的tomcat结构是:tomcat/webapps/api。war 问题是,在我将war文件复制到那里之后,我不知道java和tomcat是如何工作的,以便war

  • 我试图创建一个zip文件,并通过使用ZipArchive库的PHP脚本下载它。 这个变量包含Amazon S3上托管的图像的URL,所以首先我将它们下载到服务器上,创建zip文件并下载它们。 好心,向导!

  • 我已经设置了一个包含3列的css网格来显示我们的投资组合。我找到了一个Firefox、Internet Explorer和Safari的工作代码。但是在Chrome上,它并没有显示我的网格,所有的图片都在下面。见网址:http://www.ddw-sanitair.be 此外,它不接受“display:none”类的一些图片,因此双/三图像... 有什么建议吗? 我尝试添加网格自动行:270px;

  • 问题内容: 在Docker容器中部署Java项目的Docker方法是什么? 我是否会将战争复制到webapps中: 还是我拿爆炸的战争文件: 通常,如果它是一个普通的容器,则将部署密封的war文件,但是对于docker,这意味着每次您进行较小的更改时都会推送10-20MB的文件,而添加展开的war只会推动差异-.class文件已经改变。 部署爆炸式战争而不是战争档案有不利之处吗? 问题答案: 我想

  • 在docker容器中部署java项目的docker方法是什么? 我是否将战争复制到网络应用程序中: 还是我拿爆炸的战争文件: 通常情况下,如果密封的war文件是一个普通的容器,人们会部署它,但对于docker,这意味着每次做一个小更改时都会推送一个10-20MB的文件,而添加爆炸的war只会推送差异,即。已更改的类文件。 部署爆炸战争而不是战争文件有什么缺点吗?