【问题标题】:Deploying WAR on Tomcat via Docker - 404通过 Docker 在 Tomcat 上部署 WAR - 404
【发布时间】:2021-05-14 17:22:30
【问题描述】:

我有这个 Dockerfile:

FROM tomcat:10-jdk8
MAINTAINER your_name
# COPY path-to-your-application-war path-to-webapps-in-docker-tomcat
COPY demo-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps/

WAR 是一个只有这个控制器的 Springboot 应用程序:

@Controller
public class HelloController {
    @GetMapping("/hello")
    public String sayHello(@RequestParam(value = "name", required = false, defaultValue = "World") String name, Model model) {
        model.addAttribute("user", name);
        return "hello";
    }
}

我已经构建了映像并运行了容器。但是,当我点击 http://localhost:8080/hello 时,我得到一个 404。容器内的日志说应用程序已经部署:

10-May-2021 08:57:13.253 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/demo-0.0.1-SNAPSHOT.war]
10-May-2021 08:57:14.882 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
10-May-2021 08:57:15.043 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/demo-0.0.1-SNAPSHOT.war] has finished in [1,790] ms

为什么我会收到 HTTP 404?

编辑:我用来运行容器的命令是:

docker run -p 8080:8080 0ae485a6f486

我已按照这些说明创建可部署的 WAR https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-create-a-deployable-war-file 虽然没有成功。

我的演示项目可以在这里找到:https://github.com/th3r10n/spring-boot-war

我将它构建为:

./mvnw package

【问题讨论】:

  • 我认为 WAR 将部署在 tomcat 中,因此访问 hello servlet 的 URL 默认为 localhost:8080/demo-0.0.1-SNAPSHOT/hello。如果您希望使用不同的路径,则需要调整部署选项(WAR 的名称、部署到的路径等)。
  • 您能否添加您的“docker run”命令或您的“docker-compose”,以便我们提供帮助
  • 嗨@Marvin,我使用的命令是 docker run -p 8080:8080 0ae485a6f486
  • 嗨@JohnFergus,结果相同,即 404,只是消息不同:请求的资源 [/demo-0.0.1-SNAPSHOT/hello] 不可用
  • 无法访问您的应用程序(以及您如何构建它)我无法诊断问题。可能有很多问题导致问题 - 一个快速的谷歌抛出了很多类似的问题,需要尝试各种事情。这可能是您构建 WAR 的方式、它具有哪些 Spring 选项等。

标签: docker http-status-code-404 tomcat8


【解决方案1】:

我获取了您的应用程序,构建了 WAR 并部署到本地 tomcat。如果我点击/hello servlet(或者实际上是根/ servlet),我会收到一个 404 错误,并且我可以在服务器标准输出中看到错误,告诉我代码缺少可以使其工作的配置/设置 -

在我看到的日志中...

ERROR 24336 --- [102-8002-exec-6] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-172.20.248.102-8002-exec-6] Exception processing template "hello": Error resolving template [hello], template might not exist or might not be accessible by any of the configured Template Resolvers

...所以这是您的应用程序的问题 - 它基本上是不完整的并且不起作用。在担心尝试将其部署到 Docker 之前,您应该让它在本地工作(作为独立的 Spring Boot 应用程序,在本地的 tomcat 中或任何您想要的)。一旦你证明你的 WAR 在本地工作,那么你在 Docker 中部署它应该没有问题,就像你现在部署它一样。

【讨论】:

    【解决方案2】:

    在 Dockerfile 中暴露 8080

    FROM tomcat:jdk8-corretto
    MAINTAINER your_name
    COPY demo-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps/
    
    EXPOSE 8080
    

    Docker 运行 -p

    您需要指定如何将主机上的端口与 Spring 应用程序正在侦听的端口绑定。

    例如,

    docker run -id -p 8080:8080 --name myapp myapp-imagename:latest
    

    【讨论】:

    • 嗨@justthink,端口 8080 已被 tomcat:jdk8-corretto 基础映像公开。见hub.docker.com/layers/tomcat/library/tomcat/jdk8-corretto/…
    • 如果不指定`docker run -id`(d 表示分离),分离时容器将存在。我推荐你docker ps -adocker logs container-name。检查容器是否正在运行以及是否打印了任何堆栈跟踪。我猜 Springboot 应用程序甚至没有在容器内启动。
    猜你喜欢
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2018-03-13
    相关资源
    最近更新 更多