[JAVA] So erstellen Sie ein kleines Docker-Image der openjdk 11 (ea) -Anwendung (1 GB → 85 MB)

Introduction This is a translation of the following document into English. Da das Dokcer-Image (1 GB) von OpenJDK11 groß ist, erstellen Sie ein kleines Image (85 MB) mit alpinem Linux + jlink

I am not good at English. I would be happy if you point out some strange sentences.

Goal The goal is to reduce the file size of the docker image of the java application.

I will create an environment that moves the following.

Result

The size of 1 GB has been reduced to about 85 MB. Image size is the result output by the docker images command.

image type jlink size
openjdk:11-jdk not used 1GB
openjdk:11-jdk used 468MB
hirokimatsumoto/alpine-openjdk-11 not used 336MB
hirokimatsumoto/alpine-openjdk-11 used 84.6MB

hirokimatsumoto/alpine-openjdk-11 is https://hub.docker.com/r/hirokimatsumoto/alpine-openjdk-11/ openjdk is https://hub.docker.com/_/openjdk/

Background problem The docker image of openjdk 11 is published in the official respoitory of docker hub. https://hub.docker.com/_/openjdk/

This image has the following problem.

The file size was confirmed with the following command.

$ sudo docker images |grep jdk
docker.io/openjdk                            11-jdk   f684efd78557  2 weeks ago         979 MB
$

I confirmed that libjvm.so becomes larger when using jlink.

$ docker run -it --rm openjdk:11-jdk /bin/sh
# ls -l /usr/lib/jvm/java-11-openjdk-amd64/lib/server/
total 34944
-rw-r--r-- 1 root root     1322 Jul 27 03:41 Xusage.txt
-r--r--r-- 1 root root 18210816 Jul 27 22:22 classes.jsa
-rw-r--r-- 1 root root    14440 Jul 27 03:41 libjsig.so
-rw-r--r-- 1 root root 17551048 Jul 27 03:41 libjvm.so
# jlink \
     --module-path /opt/java/jmods \
     --compress=2 \
     --add-modules java.base,java.logging,jdk.jfr  \
     --no-header-files \
     --no-man-pages \
     --output /opt/jdk-11-mini-runtime
#  ls -l /opt/jdk-11-mini-runtime/lib/server/
total 414452
-rw-r--r-- 1 root root      1322 Aug 14 09:41 Xusage.txt
-rw-r--r-- 1 root root     25384 Aug 14 09:41 libjsig.so
-rw-r--r-- 1 root root 424362808 Aug 14 09:41 libjvm.so
#

The generated libjvm.so increased to 424 MB. This problem is probably part of the following issue issue. https://github.com/docker-library/openjdk/issues/217

How to build small image

  1. Create an environment that uses jlink on alpine linux

https://hub.docker.com/r/hirokimatsumoto/alpine-openjdk-11/

FROM alpine:3.8

RUN mkdir /opt; cd /opt; \
    wget https://download.java.net/java/early_access/alpine/25/binaries/openjdk-11-ea+25_linux-x64-musl_bin.tar.gz \
    && tar zxf openjdk-11-ea+25_linux-x64-musl_bin.tar.gz \
    && ln -s jdk-11 java \
    && rm -f openjdk-11-ea+25_linux-x64-musl_bin.tar.gz

ENV JAVA_HOME=/opt/java
ENV PATH="$PATH:$JAVA_HOME/bin"

I should use checksum, but it is not.

  1. Build Application Image using jlink.

The target application is https://github.com/h-r-k-matsumoto/k8s-jmc-sample

FROM hirokimatsumoto/alpine-openjdk-11:latest as jlink-package
# First: generate java runtime module by jlink.

RUN jlink \
     --module-path /opt/java/jmods \
     --compress=2 \
     --add-modules jdk.jfr,jdk.management.agent,java.base,java.logging,java.xml,jdk.unsupported,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument \
     --no-header-files \
     --no-man-pages \
     --output /opt/jdk-11-mini-runtime

# Second: generate run image.
FROM alpine:3.8

ENV JAVA_HOME=/opt/jdk-11-mini-runtime
ENV PATH="$PATH:$JAVA_HOME/bin"

COPY --from=jlink-package /opt/jdk-11-mini-runtime /opt/jdk-11-mini-runtime
COPY target/k8s-jmc-sample-0.1.0-SNAPSHOT.jar /opt/spring-boot/

EXPOSE 30001 7199
CMD java \
    -XX:StartFlightRecording=name=sample,filename=/spring-boot/jfr/sample.jfr,delay=30s,maxage=2h,maxsize=10m,dumponexit=true,settings=/spring-boot/config/profile.jfc \
    -Dcom.sun.management.jmxremote.port=7199 \
    -Dcom.sun.management.jmxremote.rmi.port=7199 \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false \
    -jar /opt/spring-boot/k8s-jmc-sample-0.1.0-SNAPSHOT.jar \
    --server.port=${SPRING_SERVER_PORT} \
    --spring.config.location=/spring-boot/config/application.yaml
$ mvn clean package
$ docker build  -t  gcr.io/prod-bl-cloud/k8s-jmc-sample:java11-mini-runtime .
  1. Deploy Rewrite the kubernetes configuration file and deploy it.
$ kubectl apply -f kubernetes

Reference

Recommended Posts

So erstellen Sie ein kleines Docker-Image der openjdk 11 (ea) -Anwendung (1 GB → 85 MB)
Bereitstellen von einem lokalen Docker-Image auf Heroku
So erstellen Sie eine Methode
So erstellen Sie ein leichtes Container-Image für Java-Apps
[Persönliche Notizen] So verschieben Sie ein Docker-Image in GitHub-Pakete
Vorbereiten der Erstellung einer Rails-Anwendung
Verwenden Sie Jenkins, um in Docker zu erstellen und dann ein Docker-Image zu erstellen.
So erstellen Sie ein Maven-Repository für 2020
[Docker] So erstellen Sie eine virtuelle Umgebung für Rails- und Nuxt.js-Apps
[Swift5] So erstellen Sie einen Begrüßungsbildschirm
[Rails] So erstellen Sie eine Teilvorlage
Umfang des Versuchs, eine Java-Webanwendung unter Windows Server 2016 zu erstellen
So migrieren Sie eine in einer lokalen Docker-Umgebung erstellte Webanwendung nach AWS
Docker Compact Manual (4: Erstellen eines benutzerdefinierten Bildes)
[Einführung in Docker] Erstellen Sie ein Docker-Image für maschinelles Lernen und verwenden Sie das Jupyter-Notizbuch
So erstellen Sie überall eine H2-Datenbank
Zusammenfassung zum Erstellen von selbst erstellten JSF-Tags
[Rails] So erstellen Sie ein Diagramm mit lazy_high_charts
So erhalten Sie einen Heapdump aus einem Docker-Container
So verkleinern Sie das Spring Boot Docker-Image
So erstellen Sie Pagenationen für das "Kaminari" -Array
So erstellen Sie eine Klasse, die Klasseninformationen erbt
So erstellen Sie ein Thema in Liferay 7 / DXP
So geben Sie jemandem Ihr Image mit Docker
[1.] So erstellen Sie ein Spring-MVC-Framework-Projekt
So erstellen Sie einfach ein Pulldown mit Rails
[Rails] So erstellen Sie eine Twitter-Freigabeschaltfläche
So installieren Sie Docker in der lokalen Umgebung einer vorhandenen Rails-App [Rails 6 / MySQL 8]
Ich habe versucht, mit Wercker ein Docker-Image zu erstellen und zu veröffentlichen, mit dem GlassFish 5 gestartet wird
[Docker] So sehen Sie den Inhalt von Volumes. Starten Sie einen Container mit Root-Rechten.
Ich habe ein Docker-Image für die japanische Version von SDAPS erstellt
Erstellen Sie ein Docker-Image, um eine einfache Java-App auszuführen
[Einführung] Erstellen Sie eine Ruby on Rails-Anwendung
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden
So erstellen Sie eine JDBC-URL (Oracle Database, Thin)
Gewichtsreduzierung des Docker-Images durch mehrstufige Build-React-Anwendung
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
So erstellen Sie einen Daten-URI (base64) in Java
Erstellen Sie einen Docker-Container, um EPS in eine PGF-Quelle zu konvertieren
Bearbeiten Sie Pixel, um ein Bild eines Mandelbrot-Sets zu erstellen
[Rails 6] So legen Sie ein Hintergrundbild in Rails [CSS] fest
So beurteilen Sie den Klick eines beliebigen Bildbereichs
[Apple-Abonnementangebot] So erstellen Sie eine Signatur für ein Werbeangebot
Wenn Sie eine Java-Anwendung in ein Docker-Image verwandeln möchten, ist es praktisch, Jib zu verwenden.
So installieren Sie Docker
So erstellen Sie Docker-Compose
Erstellen Sie ein Docker-Image mit installiertem Oracle JDK (yum
So erstellen Sie einen Anwendungsserver auf einer EC2-Instanz von AWS
So erstellen Sie ein Formular zur Auswahl eines Datums aus dem Kalender
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
So brennen Sie eine Installationsdiskette von Windows unter Ubuntu
Eine Reihe von Schritten zum Erstellen von Ergebnissen für Portfolios mit Rails
So verschieben Sie eine andere Klasse mit einer Schaltflächenaktion einer anderen Klasse.
[Ruby] So rufen Sie den Inhalt des Doppel-Hash ab
So erstellen Sie ein Service Builder-Portlet in Liferay 7 / DXP
Ich habe versucht, mit Docker eine Padrino-Entwicklungsumgebung zu erstellen