Containerizing Spring Boot Applications with Buildpacks
In this article, we will see how to containerize the Spring Boot applications with Buildpacks. In one of the previous articles, I discussed Jib. Jib allows us to build any Java application as the docker image without Dockerfile. Now, starting with Spring Boot 2.3, we can directly containerize the Spring Boot application as a Docker image as Buildpacks support is natively added to the Spring Boot. With Buildpacks support any Spring Boot 2.3 and above applications can be containerized without the Dockerfile. I will show you how to do that with a sample Spring Boot application by following the below steps.
Step 1: Make sure that you have installed Docker.
Step 2: Create a Spring Boot application using version Spring Boot 2.3 and above. Below is the Maven configuration of the application.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.smarttechie</groupId> <artifactId>spingboot-demo-buildpacks</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spingboot-demo-buildpacks</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!-- Configuration to push the image to our own Dockerhub repository--> <configuration> <image> <name>docker.io/2013techsmarts/${project.artifactId}:latest</name> </image> </configuration> </plugin> </plugins> </build> </project>
If you want to use Gradle, here is the Spring Boot Gradle plugin.
Step 3: I have added a simple controller to test the application once we run the docker container of our Spring Boot app. Below is the controller code.
package org.smarttechie.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoController { @GetMapping public String hello() { return "Welcome to the Springboot Buildpacks!!. Get rid of Dockerfile hassels."; } }
Step 4: Go to the root folder of the application and run the below command to generate the Docker image. Buildpacks uses the artifact id and version from the pom.xml to choose the Docker image name.
./mvnw spring-boot:build-image
Step 5: Let’s run the created Docker container image and test our rest endpoint.
docker run -d -p 8080:8080 --name springbootcontainer spingboot-demo-buildpacks:0.0.1-SNAPSHOT
Below is the output of the REST endpoint.
Step 6: Now you can publish the Docker image to Dockerhub by using the below command.
Here are some of the references if you want to deep dive into this topic.
- Cloud Native Buildpacks Platform Specification.
- Buildpacks.io
- Spring Boot 2.3.0.RELEASE Maven plugin documentation
- Spring Boot 2.3.0.RELEASE Gradle plugin documentation
That’s it. We have created a Spring Boot application as a Docker image with Maven/Gradle configuration. The source code of this article is available on GitHub. We will connect with another topic. Till then, Happy Learning!!
Published on Java Code Geeks with permission by Siva Janapati, partner at our JCG program. See the original article here: Containerizing Spring Boot Applications with Buildpacks Opinions expressed by Java Code Geeks contributors are their own. |
Pretty interesting info. I think that I could use it in my university.