Condividi tramite


Immagini dei container per la versione Microsoft di OpenJDK

Questo articolo fornisce informazioni sulle immagini del contenitore disponibili per Microsoft Build di OpenJDK.

Immagini basate su Linux

Attualmente sono disponibili immagini di contenitori basate su Linux per Ubuntu e Microsoft CBL-Mariner, ora note come Azure Linux. Le immagini vengono pubblicate nel Registro artefatti di Microsoft che si trova in mcr.microsoft.com/openjdk/jdk.

Per eseguire il pull dell'immagine più recente per un tag specifico, usare il comando seguente:

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

La tabella seguente illustra il tag da usare per la distribuzione Linux e la versione JDK.

Sistema operativo di base OpenJDK 21 OpenJDK 17 OpenJDK 11 OpenJDK 8
Ubuntu 22.04 21-ubuntu 17-ubuntu 11-ubuntu Non disponibile
CBL Mariner 2.0 21-mariner 17-mariner 11-mariner 8-mariner
CBL-Mariner 2.0 Senza distribuzione 21-distroless 17-distroless 11-distroless 8-distroless

Nota:le immagini per OpenJDK 8 vengono fornite con file binari di Eclipse Temurin, dal progetto Eclipse Adoptium.

Architetture

Le immagini precedenti sono disponibili sia per le architetture amd64 che per quelle arm64. Il runtime del contenitore recupererà l'immagine corretta in base al tuo ambiente. Per forzare il download di un'immagine per un'architettura specifica, utilizzare quanto riportato di seguito:

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

Per forzare un'architettura all'interno di un Dockerfile, è possibile usare quanto segue:

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

Per ulteriori informazioni sulla creazione di immagini container multipiattaforma, consultare la documentazione del proprio ambiente di esecuzione del container. Ad esempio, Docker e Podman.

Come usare queste immagini

Creare un Dockerfile con il contenuto seguente:

# 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"]

Immagini minimali

Le immagini distroless si basano sulla distribuzione CBL-Mariner 2.0 di Microsoft. Richiedono un approccio diverso per distribuire un'applicazione. Poiché le immagini senza distribuzione non contengono una distribuzione Linux completa, ad esempio non esiste alcuna shell.

Il parametro ENTRYPOINT di queste immagini è già configurato puntando al comando java. L'utilizzo dei Dockerfiles deve usare l'istruzione CMD per completare gli argomenti della riga di comando del processo di avvio della JVM.

Creare un Dockerfile con il contenuto seguente:

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

COPY app.jar /app.jar

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

Usare un'immagine o una versione del sistema operativo di base diversa

Se si preferisce usare una distribuzione diversa dell'immagine di base del sistema operativo, è possibile copiare JDK da un'immagine predefinita esistente usando l'istruzione COPY --from in un Dockerfile, simile all'esempio seguente:

# 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"]

È anche possibile installare JDK usando yum o apt-geto semplicemente estrarre un tar.gz file e configurare JAVA_HOME di conseguenza. Altre informazioni.

Usare una versione diversa di Ubuntu

Per distribuire Microsoft Build of OpenJDK su diverse versioni di immagini di base Ubuntu, Microsoft consiglia agli utenti di definire il proprio Dockerfiles. A titolo di riferimento, qui sotto Dockerfile compila un'immagine con 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"]

Immagini alpine

Anche se Microsoft non fornisce immagini basate su Alpine, viene fornito un set limitato di file binari JDK compilati con musl per Alpine Linux.

Gli utenti sono invitati a creare immagini del contenitore per Alpine Linux usando i file binari disponibili.

Creare un Dockerfile con il contenuto seguente:

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" ]

Creare un runtime Java personalizzato

Per creare un'immagine di runtime Java personalizzata, usare un Dockerfile a più fasi simile all'esempio seguente:

# 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"]

Per altre informazioni sulla creazione di runtime Java personalizzati, vedere Java Runtimes with jlink (Runtime Java con jlink)

Utente non radice

Le immagini vengono fornite con un app utente che può essere abilitato e usato facoltativamente utilizzando i livelli:

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"]

Nell'esempio precedente il file binario dell'applicazione viene copiato come root, perché le immagini rimangono con root per impostazione predefinita. L'applicazione viene quindi eseguita come app. La cartella /home/app è anche di proprietà dell'utente app, assegnando all'applicazione un file system scrivibile.

Impostazioni locali predefinite

Le immagini per Microsoft Build di OpenJDK sono configurate per impostazione predefinita con il locale en_US.UTF-8. Se si vogliono usare impostazioni locali diverse o un'immagine di base diversa, come descritto in precedenza, è necessario configurare manualmente le variabili di ambiente nel proprio Dockerfile e assicurarsi che le impostazioni locali desiderate siano installate.

Ad esempio, per usare il pt_BR.UTF-8 locale in un'immagine basata su Ubuntu, è possibile aggiungere le righe seguenti nel 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
...

Questo Dockerfile viene fornito come esempio. Non è progettato per suggerire le configurazioni più ottimali.

Mantenere le versioni secondarie meno recenti

Microsoft Build of OpenJDK container images are available only under the tags listed previously. Non vengono forniti tag per le versioni secondarie e i tag di versione principale hanno sempre la versione secondaria più recente per assicurarsi che gli sviluppatori abbiano l'aggiornamento più recente per qualsiasi versione principale specificata.

Queste immagini di base usano il meccanismo di gestione pacchetti sottostante delle distribuzioni Linux per installare il pacchetto JDK. Pertanto, per rimanere su una particolare versione precedente, sarà necessario usare strumenti come apt-get o yum per installare la versione secondaria specifica di JDK.

Per eseguire il rollback a versioni specifiche di immagini del sistema operativo di base diverse all'esterno dell'elenco di immagini fornite, ad esempio debian:buster-slim, è possibile usare lo stesso approccio riportato di seguito nella prima fase di una compilazione di immagini contenitore a più fasi o come parte di un flusso di installazione tradizionale del pacchetto Linux. Per altre informazioni, vedere la sezione Install on Ubuntu 18.04+ ( Install the Microsoft Build of OpenJDK).

Per CBL-Mariner e altre immagini del sistema operativo basate su RPM/yum, vedere i dettagli forniti più avanti in questo articolo.

Per Ubuntue altre immagini basate su Debian, è possibile visualizzare tutte le versioni secondarie disponibili pubblicate nei repository Microsoft Linux, come illustrato nell'esempio Bash seguente che mostra i comandi e l'output. I comandi illustrati di seguito presuppongono che il repository Microsoft Linux sia configurato, come descritto in Installare in 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
...

Questo esempio di Bash mostra come ripristinare una versione precedente dell'immagine msopenjdk-11 , ad esempio 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) ...

Per eseguire la stessa operazione nel Dockerfile, usare i comandi seguenti:

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

Questo esempio di Bash usa immagini basate su 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

Per eseguire la stessa operazione nel Dockerfile, usare i comandi seguenti:

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

Pianificazione della ricompilazione dell'immagine del contenitore

Per garantire il massimo livello di sicurezza e stabilità, le immagini dei contenitori vengono ricompilate ogni lunedì, mercoledì e venerdì. Questa pianificazione di ricompilazione regolare consente di incorporare tempestivamente le patch e gli aggiornamenti di sicurezza più recenti.

Puoi aspettarti i seguenti vantaggi da questo programma di ricostruzione:

  • Aggiornamenti tempestivi della sicurezza: Ricompilando le immagini tre volte alla settimana, si garantisce che tutte le nuove vulnerabilità di sicurezza vengano risolte rapidamente.
  • Maggiore stabilità: Gli aggiornamenti regolari consentono di mantenere la stabilità e le prestazioni delle applicazioni includendo le correzioni di bug e i miglioramenti più recenti.

In caso di domande o problemi relativi a questi aggiornamenti, fare riferimento a questa pianificazione prima di aprire un ticket di supporto.

Per altre informazioni sui criteri di supporto, vedere Roadmap del supporto per Microsoft Build of OpenJDK.

Verificare le firme dell'immagine del contenitore

Per verificare le firme dell'immagine del contenitore, installare prima di tutto i prerequisiti seguenti:

Seguire quindi questa procedura:

  1. Aggiungere il certificato all'archivio attendibilità usando il comando seguente:

    notation cert add --type ca --store supplychain msft_supply_chain.crt
    
  2. Configurare i criteri di attendibilità creando un file trustpolicy.json con il contenuto seguente:

    {
        "version": "1.0",
        "trustPolicies": [
            {
                "name": "supplychain",
                "registryScopes": [ "mcr.microsoft.com/openjdk/jdk" ],
                "signatureVerification": {
                    "level" : "strict"
                },
                "trustStores": [ "ca:supplychain" ],
                "trustedIdentities": [
                    "x509.subject: CN=Microsoft SCD Products RSA Signing,O=Microsoft Corporation,L=Redmond,ST=Washington,C=US"
                ]
            }
        ]
    }
    
  3. Importare i criteri di attendibilità usando il comando seguente:

    notation policy import trustpolicy.json
    
  4. Verificare l'immagine usando il comando seguente:

    notation verify mcr.microsoft.com/openjdk/jdk:21-distroless
    

    Verrà visualizzato l'output seguente:

    Warning: Always verify the artifact using digest(@sha256:...) rather than a tag(:21-distroless) because resolved digest may not point to the same signed artifact, as tags are mutable.
    
    Successfully verified signature for mcr.microsoft.com/openjdk/jdk@sha256:11537450b8472c1535e9a4c320033b5686e74323b19dcc8e7203e6ff1bf4ae5f
    

Immagini con sistema operativo Windows

Attualmente non vengono fornite immagini del contenitore basate su Windows.

Inviare commenti e suggerimenti su Microsoft Build of OpenJDK

Inviaci commenti, pensieri e idee per aiutarci a migliorare microsoft Build of OpenJDK. Visitare la pagina delle discussioni di OpenJDK su GitHub per inviare commenti e suggerimenti.

Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue consociate.