Build Docker Images with Maven and Gradle
One of the things that you might want to do if you are using Docker and Java is building the image from a Dockerfile in your build tool ( Maven or Gradle). In this post I am going to show you how to do it in both cases.
I am going to assume that you have the de-facto project layout, having the Dockerfile file at the root of the project.
Maven
There are several Maven plugins that can be used for building a Docker image in Maven, but one of the most used is fabric8-maven-plugin.
To start you need to register and configure the plugin in
pom.xml:
<build> <plugins> <plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.16.7</version> <configuration> <images> <image> <name>arquillian/age-checker:${project.version}</name> <build> <dockerFileDir>${project.basedir}</dockerFileDir> </build> </image> </images> </configuration> </plugin> </plugins> </build>
In configuration section you set the image name and the directory where Dockerfile is located.
Any additional files located in the dockerFileDir directory will also be added to the build context. Since Dockerfile is on the root of the project, the target directory is added too. The problem arises because this plugin uses target/docker to generate the build and if you try to build it you’ll get next exception: tar file cannot include itself. To avoid this problem you need to create .maven-dockerignore file specifying which directory must be ignored at the same level as
Dockerfile:
target/docker/
And that’s all, after that you can do:
mvn package docker:build
Notice that this plugin honor Docker environment variables like DOCKER_HOST, DOCKER_CERT_PATH, … so if your environment is correctly configured you don’t need to do anything else.
Gradle
There are several Gradle plugins that can be used for building a Docker image in Gradle, but one of the most used is gradle-docker-plugin.
To start you need to register and configure the plugin in
build.gradle:
buildscript { repositories { jcenter() } dependencies { classpath 'com.bmuschko:gradle-docker-plugin:3.0.3' } } apply plugin: 'com.bmuschko.docker-remote-api' import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage docker { if (System.env.containsKey('DOCKER_HOST') && System.env.containsKey('DOCKER_CERT_PATH')) { url = System.env.DOCKER_HOST.replace("tcp", "https") certPath = new File(System.env.DOCKER_CERT_PATH) } } task buildImage(type: DockerBuildImage) { dependsOn assemble inputDir = project.rootDir tag = "arquillian/game-service:${project.version}" }
In case of Gradle, you need to configure Docker host properties since plugin does not honor Docker environment variables. You need to configure them in docker {} block.
Finally you create a task of type DockerBuildImage, where you set the Dockerfile root directory using inputDir attribute and image name using tag attribute.
Conclusions
So in this post you’ve seen different ways of doing the same in two different build tools, which is building a Docker image from a Dockerfile. Notice that these plugins also allows you to define the Dockerfile content as a configuration field, so you are not creating a Dockerfile file, but specifying its content inside the build tool. You can read more about this feature at https://dmp.fabric8.io/ in case of Maven plugin and https://github.com/bmuschko/gradle-docker-plugin#creating-a-dockerfile-and-building-an-image in case of Gradle.
We keep learning,
Alex.
Bees’ll buzz, kids’ll blow dandelion fuzz, And I’ll be doing whatever snow does in summer., A drink in my hand, my snow up against the burning sand, Prob’ly getting gorgeously tanned in summer. (In Summer – Frozen)
Reference: | Build Docker Images with Maven and Gradle from our JCG partner Alex Soto at the One Jar To Rule Them All blog. |