To main content

Creating an early Open Liberty-Java17 image

Published by Benjamin Marwell on

While Java 17 from IBM (Semeru Runtime with OpenJ9) is not GA'd yet, this doesn't mean you cannot create an image yourself with the milestone builds. This is how it is done.

OpenLiberty 21.0.0.11 on IBM Semeru Java 17 with OpenJ9 Docker Image
OpenLiberty 21.0.0.11 on IBM Semeru Java 17 with OpenJ9 Docker Image

Short version on Twitter

I shared a short version on how to do this on twitter. If this is all you need, go ahead and build the image right now! If you would like to see a quick tutorial, just read on.

Step 1: Cloning the repositories

First step will be cloning the repositories mentioned in the tweet like so:

bmarwell@wells ~/git/ibm $ git clone https://github.com/ibmruntimes/semeru-containers.git
Cloning into 'semeru-containers'...
remote: Enumerating objects: 695, done.
remote: Counting objects: 100% (695/695), done.
remote: Compressing objects: 100% (406/406), done.
remote: Total 695 (delta 303), reused 580 (delta 244), pack-reused 0
Receiving objects: 100% (695/695), 126.35 KiB | 4.68 MiB/s, done.
Resolving deltas: 100% (303/303), done.
bmarwell@wells ~/git/ibm $ git clone https://github.com/OpenLiberty/ci.docker.git
Cloning into 'ci.docker'...
remote: Enumerating objects: 5845, done.
remote: Counting objects: 100% (439/439), done.
remote: Compressing objects: 100% (197/197), done.
remote: Total 5845 (delta 299), reused 346 (delta 241), pack-reused 5406
Receiving objects: 100% (5845/5845), 39.82 MiB | 17.25 MiB/s, done.
Resolving deltas: 100% (2602/2602), done.

Step 2: Make a Java 17 image for Semeru with OpenJ9

This is mostly copy and pasting. There is a Java 16 image. Just copy it to Java 17, exchange the URLs and checksums and build and tag it:

bmarwell@wells ~/git/ibm/semeru-containers $ cd semeru-containers

bmarwell@wells ~/git/ibm/semeru-containers $ cp -r 16 17

# the next command will insert the sha256sum and download link into the Docker build file.
# Also note that the eisting sha256sum could have changed.
bmarwell@wells ~/git/ibm/semeru-containers $ sed -i.bak -e 's#ENV JAVA_V.*#ENV JAVA_VERSION jdk-17.0.1+12_openj9-0.29.1-m1#g' -e 's#https.*jdk-16.*x64_linux.*\.tar\.gz#https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.1%2B12_openj9-0.29.1-m1/ibm-semeru-open-jdk_x64_linux_17.0.1_12_openj9-0.29.1-m1.tar.gz#g' -e 's#13.*886e#78e215d960a38883cce442f36fb3b30d2b5b98ea2f33698649cf42f5f67b8651#g' 17/jdk/ubi/Dockerfile.open.releases.full

# Tag the image
bmarwell@wells ~/git/ibm/semeru-containers $ ./build.sh ibmsemeruruntimes:open-17-jdk-ubi $PWD/17/jdk/ubi/

bmarwell@wells ~/git/ibm/semeru-containers $ docker image ls -a | grep semeru
ibmsemeruruntimes                                                       open-17-jdk-ubi                 df1c05d273c7   27 seconds ago   857MB

Tip for corporate environments

If you are building this image behind a corporate proxy and you already have your local UBI repository mirror, create a directory called 17/jdk/ubi/root and create the file etc/yum.repos.d/ubi.repo. Configure your repos there and add the directive COPY ./root / just before the first yum/dnf execution. Don't forget to add certificates to etc/pki/ca-trust/source/anchors if needed.

You might also want the referenced tomcat and IBM Semeru Runtime locally to avoid proxy authentication problems.

Step 3: Make an OpenLiberty Image based on the new Semeru image

Now that we have a Java 17 image, we can create an OpenLiberty image. Please note that the OpenLiberty repository only uses LTS releases, so we have to use 11 as a base for now.

Also note all non-kernel images are based on the kernel image, so we need to build that one first.

bmarwell@wells ~/git/ibm/ci.docker $ cp releases/21.0.0.11/kernel-slim/Dockerfile.ubi.openjdk11 releases/21.0.0.11/kernel-slim/Dockerfile.ubi.openjdk17

# Switch to our new JDK17:
sed -i.bak -e 's#FROM ibmsemeruruntime/open-11-jdk:ubi-jdk#FROM ibmsemeruruntimes:open-17-jdk-ubi#g' releases/21.0.0.11/kernel-slim/Dockerfile.ubi.openjdk17

# build and tag
bmarwell@wells ~/git/ibm/ci.docker $ ./build/build.sh --dir=releases/21.0.0.11/kernel-slim/ --dockerfile=Dockerfile.ubi.openjdk17  --tag=open-liberty:21.0.0.11-kernel-slim-java17-openj9

bmarwell@wells ~/git/ibm/ci.docker $ docker image ls | grep "open-liberty.*java17"
open-liberty                                                              21.0.0.11-kernel-slim-java17-openj9   11012c16e71f   36 seconds ago   946MB

Step 4: Use the image

You're done! Use the image as you would normally:

FROM open-liberty:21.0.0.11-kernel-slim-java17-openj9

This should lead to a output similar to this (from the JSON logs):