Deploying Spring WAR to Tomcat-based docker

Koala Yeung :

I have followed through Spring's Building a RESTful Web Service tutorial and created a dummy webapp (with "Build with Maven" instructions). I build and package the WAR. Then I run it with this command:

java -jar ./target/Dummy-1.0-SNAPSHOT.war

I can see the dummy JSON endpoint at http://localhost:8080/greeting/.

Now I want to containerize the app with Docker so I can further test it without the needs to install Tomcat to system space. This is the Dockerfile I created:

FROM tomcat:7-jre8-alpine

# copy the WAR bundle to tomcat
COPY /target/Dummy-1.0-SNAPSHOT.war /usr/local/tomcat/webapps/app.war

# command to run
CMD ["catalina.sh", "run"]

I build and run the docker binding to http://localhost:8080. I can see the Tomcat welcome page on "http://localhost:8080". But I couldn't see my app on neither:

How should I track down the issue? What could be the problem?

Update 1: The Tomcat admin interface screenshot

Tomcat Admin

Koala Yeung :

The Application.java file in the example looks like this:

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

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

This is a valid SpringBoot application, but NOT a deployable application to Tomcat. To make it deployable, you can can:

  1. redefineApplication to extend SpringBootServletInitializer from Spring framework web support; then
  2. override the configure method:

    package hello;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.support.SpringBootServletInitializer;    
    
    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(Application.class);
        }
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }
    

No need to change the pom.xml file (or any other configurations).

After rebuilding the dockerfile and run it with proper port binding, the greeting example endpoint will be available through: http://localhost:8080/app/greeting/

References

  1. Spring Boot War deployed to Tomcat
  2. Spring Boot Reference Guide: Create a deployable war file

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=463428&siteId=1