Today we will talk about a way to build a docker image shipping the following tools :
- Maven (latest version)
- OpenJdk 8
- Openjdk 11 lts
In a next article, we will see how to use this image in order to build a multi modules Java project.
Finally we will go through the Continuous Integration process for our project using Github.
Why a new docker image for Java & Maven ?
Usually in order to compile a project using Maven and Java in a docker environment, you head up to the Maven official docker hub page and pick up the right version.
However in case you need to use 2 different JDKs, you will notice that you won’t find what you need on the Maven docker hub page.
After some research on different resources, you will also understand that it is not that easy to find some maintained version that fits you.
More about Maven docker official images
If you browse the various tags provided on docker hub, you can take a closer look at a dockerfile (ex: AdoptOpenJdk 11) and see that it takes its sources from the Jdk related image.
The Maven binaries will be loaded during the building process. We will talk about the other files next (settings…).
Now I bet you are curious on what Linux version the Jdk image is built upon ?
AdoptOpenJdk docker image & linux
Let’s review a bit the Dockerfile of this prebuilt distribution offered by the open source community : AdoptOpenJDK
FROM ubuntu:18.04 ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8' RUN apt-get update \
Ubuntu, yes you are right !
If you are used to Docker, you might say : why not using an Alpine version of Linux to reduce the size of the final image ?
Base linux distro for our image
The use of Alpine Linux could have been made if we had shipped it with Glibc. However at the moment, this is not straightforward according to Alpine linux community.
So the use of Ubuntu seems fair but if you follow a few comparison charts, you might pick up another distribution.
We decided to go with Minideb and the bitnami docker version.
Dockerfile for Maven, jdk8 & jdk11 LTS
Now that we’ve explained how we got here, time for sharing the Dockerfile :
FROM bitnami/minideb:latest RUN apt-get update \ && apt-get -y install curl ADD https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u252-b09/OpenJDK8U-jdk_x64_linux_hotspot_8u252b09.tar.gz /opt/jdk/ RUN tar -xzvf /opt/jdk/OpenJDK8U-jdk_x64_linux_hotspot_8u252b09.tar.gz -C /opt/jdk ADD https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.7%2B10/OpenJDK11U-jdk_x64_linux_hotspot_11.0.7_10.tar.gz /opt/jdk/ RUN tar -xzvf /opt/jdk/OpenJDK11U-jdk_x64_linux_hotspot_11.0.7_10.tar.gz -C /opt/jdk ARG MAVEN_VERSION=3.6.3 ARG USER_HOME_DIR="/root" ARG SHA=c35a1803a6e70a126e80b2b3ae33eed961f83ed74d18fcd16909b2d44d7dada3203f1ffe726c17ef8dcca2dcaa9fca676987befeadc9b9f759967a8cb77181c0 ARG BASE_URL=https://apache.osuosl.org/maven/maven-3/${MAVEN_VERSION}/binaries RUN mkdir -p /usr/share/maven /usr/share/maven/ref \ && curl -fsSL -o /tmp/apache-maven.tar.gz ${BASE_URL}/apache-maven-${MAVEN_VERSION}-bin.tar.gz \ && echo "${SHA} /tmp/apache-maven.tar.gz" | sha512sum -c - \ && tar -xzf /tmp/apache-maven.tar.gz -C /usr/share/maven --strip-components=1 \ && rm -f /tmp/apache-maven.tar.gz \ && ln -s /usr/share/maven/bin/mvn /usr/bin/mvn \ && rm -f /opt/jdk/*.gz ENV JAVA_HOME /opt/jdk/jdk8u252-b09 ENV MAVEN_HOME /usr/share/maven ENV MAVEN_CONFIG "$USER_HOME_DIR/.m2" COPY mvn-entrypoint.sh /usr/local/bin/mvn-entrypoint.sh COPY settings.xml /usr/share/maven/ref/ RUN chmod +x /usr/local/bin/mvn-entrypoint.sh ENTRYPOINT ["/usr/local/bin/mvn-entrypoint.sh"] CMD ["mvn"]
Notes about what’s going on on the Dockerfile :
- Set JDK 8 as the default jdk (by defining the JAVA_HOME pointing to this kit)
- Loading the mvn-entrypoint.sh as AdoptOpenJDK does
- Loading the settings.xml file for Maven (taken from AdoptOpenJDK as well)
Using a Debian version, we then download the proper jdks and set the entrypoint and default command to run when running the container.
Entrypoint & Settings configuration files
We won’t customize the files used by the image for running Maven but use the ones provided by the version we wish to ship in.
Just download both files by picking the proper image onto official Maven docker hub.



Copy both files respectively under :
- mvn-entrypoint.sh
- settings.xml
Image Build
In order to build the image, simply type the following command :

More external resources
And more details about Docker image optimization with Docker Slim
Leave a Reply