.war 在 tomcat 在 docker, 404 在 servlet

.war on tomcat on docker, 404 on servlet

我终于找到了使用 Docker 的动力:我尝试在 tomcat 运行ning 上部署一个基本的“hello-world”servlet,在 [=41] =]容器。

当我 运行 它在由 intelliJ 启动的 Tomcat 上时,这个 servlet 工作得很好。

但是当我将它与 Docker 一起使用时,使用这个 Docker 文件

FROM tomcat:latest
ADD example.war /usr/local/tomcat/webapps/
EXPOSE 8080
CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]

而我build/start image/container:

docker build -t example .

docker run -p 8090:8080 example

index.jsp 在 localhost:8090/example/ 上正确显示,但在 localhost:8090/example/hello-servlet[=16 上尝试访问 servlet 时收到 404 =]

同时,我可以访问 localhost:8080/example/hello-servlet,当我的非 dockerized tomcat 运行s 时,它运行良好.

这是 servlet 代码:

package io.bananahammock.bananahammock_backend;

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
    private String message;

    public void init() {
        message = "Hello World!";
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");

        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>" + message + "</h1>");
        out.println("</body></html>");
    }

    public void destroy() {
    }
}

我错过了什么?

自 2021 年 8 月 31 日起(this commit) the Docker image tomcat:latest uses Tomcat 10 (see the list of available tags)。

您可能已经知道,使用 javax.* 命名空间的软件无法在 Jakarta EE 9 服务器上运行,例如 Tomcat 10(参见 )。因此:

  • 如果是新项目,迁移到 jakarta.* 命名空间并在 Tomcat 10 或更高版本上测试所有内容,
  • 如果它是遗留项目,请使用另一个 Docker 图片,例如tomcat:9 标签。