Images conteneur pour la build Microsoft d’OpenJDK

Cet article fournit des informations sur les images conteneur disponibles pour la build Microsoft d’OpenJDK.

Images basées sur Linux

Nous fournissons actuellement des images conteneur basées sur Linux pour Ubuntu et Microsoft CBL-Mariner, désormais appelé Azure Linux. Les images sont publiées dans le Registre des artefacts Microsoft à l’adresse mcr.microsoft.com/openjdk/jdk.

Pour tirer (pull) la dernière image pour une balise spécifique, utilisez la commande suivante :

docker pull mcr.microsoft.com/openjdk/jdk:<tag>

Le tableau suivant montre la balise à utiliser pour votre distribution Linux et votre version de JDK.

Système d’exploitation de base OpenJDK 21 OpenJDK 17 OpenJDK 11 OpenJDK 8
Ubuntu 22.04 21-ubuntu 17-ubuntu 11-ubuntu N/A
CBL Mariner 2.0 21-mariner 17-mariner 11-mariner 8-mariner
CBL-Mariner 2.0 Distroless 21-distroless 17-distroless 11-distroless 8-distroless

Remarque : les images pour OpenJDK 8 sont fournies avec les binaires d’Eclipse Temurin, du projet Eclipse Adoptium.

Architectures

Les images ci-dessus sont proposées pour les architectures amd64 et arm64. Le runtime de votre conteneur doit tirer la bonne image en fonction de votre environnement. Pour forcer le tirage d’une image pour une architecture spécifique, utilisez ce qui suit :

$ docker pull --platform=linux/arm64 mcr.microsoft.com/openjdk/jdk:21-mariner

Pour forcer une architecture à l’intérieur d’un Dockerfile, vous pouvez utiliser ce qui suit :

FROM --platform=linux/arm64 mcr.microsoft.com/openjdk/jdk:21-mariner AS build
# ...

Pour plus d’informations sur la création d’images conteneur multiplateformes, consultez la documentation du runtime de votre conteneur (par exemple, Docker et Podman).

Comment utiliser ces images

Créez un Dockerfile avec le contenu suivant :

# Example using MS Build of OpenJDK image directly
FROM mcr.microsoft.com/openjdk/jdk:21-ubuntu

# Continue with your application deployment
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]

Distroless

Les images distroless sont basées sur la distribution CBL-Mariner 2.0 publiée par Microsoft. Elles nécessitent une approche différente pour déployer une application. Par exemple, aucun interpréteur de commandes n’est fourni dans la mesure où les images distroless ne contiennent pas une distribution complète de Linux.

Le ENTRYPOINT de ces images est déjà configuré pour pointer vers la commande java. La consommation de Dockerfiles doit utiliser l’instruction CMD pour compléter les arguments de ligne de commande du processus du lanceur JVM.

Créez un Dockerfile avec le contenu suivant :

FROM mcr.microsoft.com/openjdk/jdk:21-distroless

COPY app.jar /app.jar

CMD ["-Xmx256m", "-jar", "/app.jar"]

Utiliser une autre image ou version du système d’exploitation de base

Si vous préférez utiliser une autre distribution d’image de base du système d’exploitation, vous pouvez copier le JDK à partir d’une image prédéfinie existante à l’aide de l’instruction COPY --from dans un fichier Docker, comme dans l’exemple suivant :

# Example using MS Build of OpenJDK image with a different base image
FROM debian:buster-slim
ENV LANG en_US.UTF-8
ENV JAVA_HOME /usr/lib/jvm/msopenjdk-21-amd64
ENV PATH "${JAVA_HOME}/bin:${PATH}"
COPY --from=mcr.microsoft.com/openjdk/jdk:21-ubuntu $JAVA_HOME $JAVA_HOME

# Continue with your application deployment
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]

Vous pouvez également installer le JDK en utilisant yum ou apt-get, ou simplement en extrayant un fichier tar.gz et en configurant JAVA_HOME en conséquence. En savoir plus.

Utiliser une autre version d’Ubuntu

Pour déployer la build Microsoft d’OpenJDK sur différentes versions d’images de base d’Ubuntu, Microsoft recommande aux utilisateurs de créer leurs propres Dockerfiles. Pour référence, le Dockerfile ci-dessous génère une image avec Ubuntu 24.04.

# Example using MS Build of OpenJDK image with a different version of Ubuntu
FROM ubuntu:24.04
ENV LANG en_US.UTF-8
ENV JAVA_HOME /usr/lib/jvm/msopenjdk-21-amd64
ENV PATH "${JAVA_HOME}/bin:${PATH}"
COPY --from=mcr.microsoft.com/openjdk/jdk:21-ubuntu $JAVA_HOME $JAVA_HOME

# Continue with your application deployment
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]

Images Alpine

Bien que Microsoft ne fournisse pas d’images basées sur Alpine, un ensemble limité de binaires JDK compilés avec musl est fourni pour Alpine Linux.

Les utilisateurs sont invités à créer des images conteneur pour Alpine Linux à l’aide des binaires disponibles.

Créez un Dockerfile avec le contenu suivant :

FROM alpine:latest

ENV JAVA_HOME=/usr/lib/jdk
ENV PATH=${PATH}:${JAVA_HOME}/bin

# Default to UTF-8 file.encoding
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'

# (Optional) Add extra packages for fontconfig and ttf-dejavu to support server-side image generation
RUN apk add --no-cache fontconfig libretls musl-locales musl-locales-lang ttf-dejavu tzdata zlib \
    && rm -rf /var/cache/apk/*

# Download and extract JDK 17
RUN wget -nv -O jdk.tar.gz https://aka.ms/download-jdk/microsoft-jdk-17-alpine-x64.tar.gz && \
    mkdir $JAVA_HOME && \
    tar xf jdk.tar.gz -C $JAVA_HOME --strip-components 1 --no-same-owner

# Copy the application
COPY app.jar /app.jar

CMD [ "java", "-jar", "/app.jar" ]

Créer un runtime Java personnalisé

Pour créer une image de runtime Java personnalisé, utilisez un fichier Dockerfile multiphase similaire à l’exemple suivant :

# Example of custom Java runtime using jlink in a multi-stage container build
FROM mcr.microsoft.com/openjdk/jdk:21-ubuntu as runtime-build

# Create a custom Java runtime
RUN $JAVA_HOME/bin/jlink \
         --add-modules java.base \
         --strip-debug \
         --no-man-pages \
         --no-header-files \
         --compress=2 \
         --output /javaruntime

# Define your base image. You may use any base OS and version of your choice.
FROM debian:buster-slim
ENV LANG en_US.UTF-8
ENV JAVA_HOME /usr/lib/jvm/msopenjdk-21-amd64
ENV PATH "${JAVA_HOME}/bin:${PATH}"
COPY --from=runtime-build /javaruntime $JAVA_HOME

# Continue with your application deployment
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]

Pour plus d’informations sur la création de runtimes Java personnalisés, consultez Runtimes Java avec jlink.

Utilisateur non-racine

Les images sont fournies avec un utilisateur app qui peut éventuellement être activé et utilisé par des couches de consommation :

FROM mcr.microsoft.com/openjdk/jdk:21-mariner

WORKDIR /home/app
COPY japp.jar japp.jar
USER app

CMD ["java", "-jar", "/opt/app/japp.jar"]

Dans l’exemple ci-dessus, le binaire de l’application est copié en tant que root, car les images restent avec root par défaut. L’application est ensuite exécutée en tant que app. Le dossier /home/app appartient également à l’utilisateur app, ce qui donne à l’application un système de fichiers accessible en écriture.

Paramètres régionaux par défaut

Les images pour la build Microsoft Build d’OpenJDK sont configurées par défaut avec les paramètres régionaux en_US.UTF-8. Si vous souhaitez utiliser des paramètres régionaux différents ou une autre image de base comme décrit précédemment, vous devez configurer manuellement des variables d’environnement dans votre propre fichier Dockerfile et vérifier que les paramètres régionaux souhaités sont installés.

Par exemple, pour utiliser les paramètres régionaux pt_BR.UTF-8 sur une image basée sur Ubuntu, vous pouvez ajouter les lignes suivantes à votre Dockerfile :

...
USER root
RUN apt-get update
RUN apt-get install -y locales

RUN sed -i '/pt_BR.UTF-8/s/^# //g' /etc/locale.gen
RUN locale-gen

ENV LANG pt_BR.UTF-8
ENV LANGUAGE pt_BR:pt
ENV LC_ALL pt_BR.UTF-8
...

Ce Dockerfile est fourni à titre d’exemple. Il n’est pas destiné à suggérer les configurations optimales.

Rester sur des versions mineures antérieures

Les images conteneur de la build Microsoft d’OpenJDK ne sont disponibles que sous les balises répertoriées précédemment. Nous ne fournissons pas de balises pour les versions mineures, et les balises de version majeure ont toujours la dernière version mineure de façon à ce que les développeurs disposent de la dernière mise à jour pour une version majeure donnée.

Ces images de base utilisent le mécanisme de gestionnaire de package sous-jacent des distributions Linux pour installer le package JDK. Ainsi, pour rester sur une version antérieure particulière, vous devez utiliser des outils tels que apt-get ou yum pour installer la version mineure spécifique du JDK.

Pour revenir à des versions spécifiques sur différentes images de système d’exploitation de base en dehors de la liste des images fournies, par exemple debian:buster-slim, vous pouvez utiliser la même approche ci-dessous dans la première phase d’une build d’image conteneur multiphase ou dans le cadre d’un flux d’installation de package Linux traditionnel. Pour plus d’informations, consultez la section Installer sur Ubuntu 18.04+ de la page Installer la build Microsoft d’OpenJDK.

Pour CBL-Mariner et d’autres images de système d’exploitation basées sur RPM/yum, consultez les détails fournis plus loin dans cet article.

Pour Ubuntu et d’autres images basées sur Debian, vous pouvez afficher toutes les versions mineures disponibles publiées dans les référentiels Microsoft Linux, comme indiqué dans l’exemple Bash suivant montrant les commandes et la sortie. Les commandes présentées ici supposent que le référentiel Microsoft Linux est configuré comme décrit dans Installer sur Ubuntu 18.04+.

$ docker run --pull=always -ti --rm mcr.microsoft.com/openjdk/jdk:11-ubuntu
root@c60eacd7dd7d:/# apt-get update
...

root@c60eacd7dd7d:/# apt-cache madison msopenjdk-11
msopenjdk-11 |  11.0.23-1 | https://packages.microsoft.com/ubuntu/22.04/prod jammy/main amd64 Packages
msopenjdk-11 |  11.0.22-1 | https://packages.microsoft.com/ubuntu/22.04/prod jammy/main amd64 Packages
msopenjdk-11 |  11.0.21-1 | https://packages.microsoft.com/ubuntu/22.04/prod jammy/main amd64 Packages
msopenjdk-11 | 11.0.20.1-1 | https://packages.microsoft.com/ubuntu/22.04/prod jammy/main amd64 Packages
msopenjdk-11 |  11.0.20-3 | https://packages.microsoft.com/ubuntu/22.04/prod jammy/main amd64 Packages
msopenjdk-11 |  11.0.20-2 | https://packages.microsoft.com/ubuntu/22.04/prod jammy/main amd64 Packages
msopenjdk-11 |  11.0.20-1 | https://packages.microsoft.com/ubuntu/22.04/prod jammy/main amd64 Packages
msopenjdk-11 |  11.0.19-1 | https://packages.microsoft.com/ubuntu/22.04/prod jammy/main amd64 Packages
msopenjdk-11 |  11.0.18-1 | https://packages.microsoft.com/ubuntu/22.04/prod jammy/main amd64 Packages
...

Cet exemple Bash montre comment faire passer votre image de msopenjdk-11 à une version antérieure, disons 11.0.16-1 :

root@dd24eca5bdb3:/# java -version
openjdk version "11.0.23" 2024-04-16 LTS
OpenJDK Runtime Environment Microsoft-9394293 (build 11.0.23+9-LTS)
OpenJDK 64-Bit Server VM Microsoft-9394293 (build 11.0.23+9-LTS, mixed mode, sharing)

root@a93cd1ed8783:/# apt-get -y install -y --allow-downgrades msopenjdk-11=11.0.16-1
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  fonts-dejavu
The following NEW packages will be installed:
  fonts-dejavu
The following packages will be DOWNGRADED:
  msopenjdk-11
0 upgraded, 1 newly installed, 1 downgraded, 0 to remove and 0 not upgraded.
Need to get 194 MB of archives.
After this operation, 13.0 MB disk space will be freed.
Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 fonts-dejavu all 2.37-2build1 [3,192 B]
Get:2 https://packages.microsoft.com/ubuntu/22.04/prod jammy/main amd64 msopenjdk-11 amd64 11.0.16-1 [194 MB]
Fetched 194 MB in 18s (10.7 MB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package fonts-dejavu.
(Reading database ... 9151 files and directories currently installed.)
Preparing to unpack .../fonts-dejavu_2.37-2build1_all.deb ...
Unpacking fonts-dejavu (2.37-2build1) ...
dpkg: warning: downgrading msopenjdk-11 from 11.0.23-1 to 11.0.16-1
Preparing to unpack .../msopenjdk-11_11.0.16-1_amd64.deb ...
update-alternatives: using /usr/lib/jvm/msopenjdk-11-amd64/lib/jfr to provide /usr/bin/jfr (jfr) in auto mode
Unpacking msopenjdk-11 (11.0.16-1) over (11.0.23-1) ...
Setting up fonts-dejavu (2.37-2build1) ...
Setting up msopenjdk-11 (11.0.16-1) ...

Pour faire la même chose dans votre Dockerfile, utilisez les commandes suivantes :

FROM mcr.microsoft.com/openjdk/jdk:11-ubuntu
...
RUN apt-get update && \
    apt-get install -y --allow-downgrades msopenjdk-11=11.0.16-1
...

Cet exemple Bash utilise des images basées sur CBL-Mariner :

root [ / ]# java -version
openjdk version "11.0.15" 2022-04-19 LTS
OpenJDK Runtime Environment Microsoft-32930 (build 11.0.15+10-LTS)
OpenJDK 64-Bit Server VM Microsoft-32930 (build 11.0.15+10-LTS, mixed mode)

root [ / ]# yum update
...

root [ / ]# yum list msopenjdk-11
Loaded plugin: tdnfrepogpgcheck
msopenjdk-11.x86_64   11.0.14+9_LTS-1    @System
msopenjdk-11.x86_64   11.0.10+9-1        packages-microsoft-com-prod
msopenjdk-11.x86_64   11.0.11+9-1        packages-microsoft-com-prod
msopenjdk-11.x86_64   11.0.12+7-1        packages-microsoft-com-prod
msopenjdk-11.x86_64   11.0.13+8_LTS-1    packages-microsoft-com-prod
msopenjdk-11.x86_64   11.0.14+9_LTS-1    packages-microsoft-com-prod

root [ / ]# yum install -y --nogpgcheck msopenjdk-11-11.0.15-1
Loaded plugin: tdnfrepogpgcheck

Downgrading:
msopenjdk-11  x86_64  11.0.15-1  mariner-official-microsoft  308.10M  183.75M

Total installed size: 308.10M
Total download size: 183.75M
msopenjdk-11                         192678446 100%
Testing transaction
Running transaction
Installing/Updating: msopenjdk-11-11.0.15-1.x86_64
Removing: msopenjdk-11-11.0.23-1.x86_64

Pour faire la même chose dans votre Dockerfile, utilisez les commandes suivantes :

FROM mcr.microsoft.com/openjdk/jdk:11-mariner
...
RUN yum update && \
    yum install -y --nogpgcheck msopenjdk-11-11.0.15-1
...

Planification de régénération d’image conteneur

Pour veiller au niveau le plus élevé de sécurité et de stabilité, nous régénérons nos images conteneur chaque lundi, mercredi et vendredi. Cette planification de régénération régulière nous permet d’incorporer rapidement les derniers correctifs de sécurité et mises à jour.

Vous pouvez anticiper les avantages suivants de cette planification de régénération :

  • Mises à jour de sécurité en temps opportun : grâce à la régénération des images trois fois par semaine, nous veillons à ce que toute vulnérabilité de sécurité soit traitée rapidement.
  • Stabilité améliorée : les mises à jour régulières permettent de maintenir une stabilité et un niveau de performance de vos applications en incluant les améliorations et les correctifs de bogue les plus récents.

Si vous avez des questions ou rencontrez des problèmes liés à ces mises à jour, consultez cette planification avant d’ouvrir un ticket de support.

Pour découvrir plus d’informations sur nos stratégies de support, consultez Feuille de route du support pour Microsoft Build d’OpenJDK.

Images basées sur Windows

Nous ne fournissons pas actuellement d’images conteneur basées sur Windows.

Fournir des commentaires sur la build Microsoft d’OpenJDK

Envoyez-nous vos commentaires, vos pensées et vos idées pour nous aider à améliorer la build Microsoft d’OpenJDK. Consultez notre page de discussions OpenJDK sur GitHub pour nous faire part de vos commentaires.

Java et OpenJDK sont des marques ou des marques déposées d’Oracle et/ou de ses affiliés.