Build and push Spring Boot Docker images with boost-maven-plugin

Do you want an efficient Docker image of your Spring Boot application? Do you want a Maven plugin to do the job? If the answer is yes, you are in the right place. The boost-maven-plugin provides a simple and efficient way to build your Docker image without even having to write a Dockerfile.

Writing a Dockerfile to create an efficient Docker image requires more than just an understanding of the application. It requires optimization techniques and capabilities in Docker that go beyond a simplistic Dockerfile approach. The Boost Maven plugin provides a functionality to build and push layered Docker images of Spring Boot applications using Liberty.

In a previous blog post, Creating dual layer Docker images for Spring Boot apps, we showed how to create an efficient Docker image by writing the Dockerfile yourself. Using the Boost Maven plugin, you can create an efficient Docker image with only minimal knowledge of Docker. Just install and run Docker on your machine to get started.

Configuring the Boost Maven plugin

In your Spring Boot application, after the spring-boot-maven-plugin entry in the pom.xml file, add another entry for the boost-maven-plugin in the <plugins> section:

<plugin>
  <groupId>io.openliberty.boost</groupId>
  <artifactId>boost-maven-plugin</artifactId>
  <version>0.1</version>
</plugin>

This adds the boost-maven-plugin to your project.

Building the Docker image

You can build the Docker image either by adding an execution goal to the pom.xml or by running the goal directly in the terminal.

The docker-build goal creates a Liberty-specific Dockerfile and builds the Docker image. If a Dockerfile already exists in that location, you’ll see a warning and the existing Dockerfile is used to create the Docker image.

The build creates a Docker image with a default repository name as ${project.artifactId} and a default tag latest.

Updating the pom.xml

To add the goal to your pom.xml, update the boost-maven-plugin entry in the pom.xml with the docker-build goal:

<plugin>
  <groupId>io.openliberty.boost</groupId>
  <artifactId>boost-maven-plugin</artifactId>
  <version>0.1</version>
  <executions>
    <execution>
      <goals>
        <goal>docker-build</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Run mvn clean package.

Running the goal directly

Alternatively, you can just run the goal directly:

Run mvn clean package

Run mvn boost:docker-build

Running the Docker image

Now that the Docker image is built, you can see the image in your local Docker registry.

Run docker images

Now run the application. The argument -p 9080:9080 maps the port opened inside the Docker container to a port in your operating system.

Run docker run -p 9080:9080 ${project.artifactId}

You can access the application on localhost:9080.

Pushing the Docker image to a registry

To push an image to a public or private registry, you need to configure the repository parameter in the format [REGISTRYHOST/][USERNAME/]NAME. The tag parameter is set to latest by default. You can do this either by adding an execution goal to the pom.xml or by running the goal directly in the terminal.

Updating the pom.xml

To add the goal to your pom.xml, update the plugin entry in the pom.xml:

<plugin>
  <groupId>io.openliberty.boost</groupId>
  <artifactId>boost-maven-plugin</artifactId>
  <version>0.1</version>
  <configuration>
    <repository>[your_domain_name]/${project.artifactId}</repository>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>docker-build</goal>
        <goal>docker-push</goal>
      </goals>
    </execution>
  </executions>
</plugin>

For a public registry like Docker Hub, replace [your_domain_name] with your Docker Hub username. For a private registry like IBM Container registry, replace [your_domain_name] with with your IBM Container Registry Host. You may need to include the namespace. For example, registry.ng.bluemix.net/test.

Update the Maven settings.xml file with your authentication details for the registry, for example:

  • For a public registry like Docker Hub:

    <server>
      <id>docker.io</id>
      <username>[your_registry_username]</username>
      <password>[your_registry_password]</password>
    </server>
  • For a private registry like IBM Container Registry:

    <server>
      <id>registry.ng.bluemix.net</id>
      <username>token</username>
      <password>[your_registry_token]</password>
    </server>

Run mvn clean install This creates a Docker image with the given repository name and the default tag latest, and then pushes the image to the registry.

Running the goal directly

Alternatively, to run the goal directly, first authenticate with the registry:

  • For a public registry like Docker Hub:

    docker login
  • For a private registry like IBM Container Registry:

    docker login -u token -p [your_registry_token] registry.ng.bluemix.net

Run mvn clean package

Run mvn boost:docker-build

Run mvn boost:docker-push

Try it out!

Building efficient Docker images has never been so easy!! Try the Boost Maven plugin to build and push efficient Docker images of your Spring Boot applications.

Just head over to the Sample app project and follow the instructions to build Liberty-based Docker images.

Share this post: