【问题标题】:Deploying a Spring Boot Application in Tomcat in a Docker image在 Docker 映像中的 Tomcat 中部署 Spring Boot 应用程序
【发布时间】:2021-01-17 08:06:39
【问题描述】:

我和一个朋友正在尝试在 docker 镜像中设置一个 tomcat 服务器,该镜像将运行我们将提供给它的 .war 文件。

我们运行了 Docker 镜像,这是 Dockerfile:

FROM tomcat:10-jdk8

ADD ./Build/sample.war /usr/local/tomcat/webapps/

EXPOSE 8080

如您所见,它采用 tomcat docker 映像并将我们的 sample.war 添加到 webapps 文件夹。在我看来,这应该足以运行它。

Java 应用程序是一个简单的 Spring Boot 应用程序,这是主类:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

这是我们正在使用的控制器:

package com.example.demo.repos;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/")
public class UltraRepository {
    @GetMapping("/test")
    public String testGet() {
        return "Wow, it works!";
    }
}

当我在本地运行应用程序,或者构建 .war 文件并在我的电脑上本地运行它时,它工作正常。当我访问 http://localhost:8080/test 时,给我“哇,它有效”。

但是当我们在 docker 文件中运行它并访问 http://localhost:8080/sample/test(我认为这将是正确的 url)时,我们会收到以下消息: https://i.stack.imgur.com/tMQQC.png

当我们查看运行tomcat的docker的日志时,它说它已经成功启动了应用程序。

有谁知道我们可能需要进行哪些更改才能使其正常工作?

提前致谢!

【问题讨论】:

  • 你有没有进入 Docker 容器?到了那里,你检查过路径吗? .war 文件没有创建路径 /sample/test,所以您还需要复制到图像中吗?

标签: java spring-boot docker tomcat


【解决方案1】:

您用来运行 Container 的命令是什么?您需要使用 -p 选项将本地端口映射到容器端口,如下所示: Docker run -p 8080:8080 image_name

【讨论】:

  • 正如您在 404 消息的屏幕截图中看到的,我们能够访问 Tomcat 服务器。我们正在使用 docker-compose.yml,它也将端口 8080 映射到 8080。
【解决方案2】:

事实证明这是因为我们使用了 tomcat:10-jdk8,而我们不得不使用 tomcat:jdk11,因为 SpringBoot 应用程序也是使用 Java 11 制作的。

【讨论】:

    【解决方案3】:

    您正在扩展SpringBootServletInitializer,但没有覆盖其configure 方法。您可以在DemoApplication 类中添加以下方法来解决此问题。

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);
    }
    

    SpringBootServletInitializer 类允许我们在应用程序由 servlet 容器运行时通过覆盖 configure() 方法来配置应用程序。

    【讨论】:

    • 将此添加到课程中,仍然没有运气:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2020-04-17
    • 2017-04-01
    • 2019-10-12
    • 2016-01-16
    • 2019-04-30
    相关资源
    最近更新 更多