Using fabric8 docker-maven-plugin to automate docker builds

In building the required libraries for a docker container, using a maven project, the libraries have to be copied to a separate location and we have to manually run a docker build. This process is cumbersome since you have to repeat the same process over even if there is a slight modification.

fabric8 docker-maven-plugin is the perfect solution for this requirement. spotify also supports a docker plugin. However fabric8 provides much more functionalities. For example, with fabric8 it’s possible to inject values to the docker file with ease.

fabric8 provides a great source of documentation (https://dmp.fabric8.io/). However for a beginner, it could be challenging. My requirement was to configure the plugin in
such a way that would enable even a user without docker on his/her machine to do a maven build.

Configuring fabric8 docker-maven-plugin

The first step was to move the variable names to the POM so that configurations can be separated in order to improve maintainability.

<fabric8io.docker.version>0.21.0</fabric8io.docker.version>
<docker.registry>myregistry.malith.com:5000</docker.registry>
<docker.image.tag>latest</docker.image.tag>
<docker.repository>projectname:${docker.image.tag</docker.repository>
<docker.fileName>Dockerfile</docker.fileName>
<docker.skip>false</docker.skip>

Next under the <build><plugins> tag add the maven docker plugin.

<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>${fabric8io.docker.version}</version>
    <configuration>
        <registry>${docker.registry}</registry>
        <useColor>true</useColor>
        <verbose>true</verbose>
        <skip>${docker.skip}</skip>
        <images>
            <image>
                <name>${docker.registry}/${docker.repository}</name>
                <build>
                    <dockerFileDir>${project.build.directory}/projectname-${project.version}-docker/projectname</dockerFileDir>
                    <filter>@</filter>
                    <dockerFile>${docker.fileName}</dockerFile>
                    <tags>
                        <tag>${docker.image.tag}</tag>
                    </tags>
                 </build>
             </image>
         </images>
    </configuration>
    <executions>
         <execution>
             <id>start</id>
             <phase>pre-integration-test</phase>
             <goals>
             <!-- "build" should be used to create the images with the artifact -->
                 <goal>build</goal>
                 <goal>start</goal>
             </goals>
          </execution>
          <execution>
               <id>stop</id>
               <phase>post-integration-test</phase>
               <goals>
                   <goal>stop</goal>
               </goals>
          </execution>
     </executions>
</plugin>

Next, I needed to skip the execution of the plugin if the user does not want to build the docker image. Therefore I created a profile, that would set the variable ${docker.skip} to true on the provision of the variable skipDocker.

I added the following section to the pom.

<profiles>
    <profile>
        <id>docker</id>
        <properties>
            <docker.skip>true</docker.skip>
        </properties>
        <activation>
            <property>
                <name>skipDocker</name>
                <value>true</value>
            </property>
        </activation>
    </profile>
</profiles>

Based on the above code snippet, if skipDocker has been given as a maven directive, it would set docker.skip to true, effectively skipping the execution of the plugin.

Therefore a user can skip building the docker image simply by,

maven clean install -DskipDocker

Fabric8 has a lot of support for docker builds. I have a lot to explore. Hope you’ve found my findings useful. Don’t forget to leave a comment. 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *