我有这个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发布于 2021-05-14 17:22:30
我拿了你的应用程序,构建了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启动应用程序,在本地的tomcat中,或者任何你想要的东西)。一旦你证明了你的WAR可以在本地工作,那么你在Docker中部署它应该没有问题,就像你现在部署它的方式一样。
发布于 2021-05-10 19:57:47
在Dockerfile中暴露8080
FROM tomcat:jdk8-corretto
MAINTAINER your_name
COPY demo-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps/
EXPOSE 8080Docker运行-p
您需要指定希望如何将主机上的端口与Spring应用程序正在侦听的端口绑定。
例如,
docker run -id -p 8080:8080 --name myapp myapp-imagename:latesthttps://stackoverflow.com/questions/67467922
复制相似问题