Immagini del contenitore per Microsoft Build 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. Le immagini vengono pubblicate nel Registro Contenitori 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 N/D
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 EclipseTemo, dal progetto Eclipse Adoptium .

Architetture

Le immagini precedenti sono disponibili sia per le architetture che per amd64arm64 le architetture. Il runtime del contenitore eseguirà il pull dell'immagine corretta in base all'ambiente in uso. Per forzare un pull di un'immagine per un'architettura specifica, usare quanto segue:

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

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

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

Per altre informazioni sulla creazione di immagini del contenitore multipiattaforma, vedere la documentazione del runtime del contenitore. 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:17-ubuntu

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

Distribuzione senza distribuzione

Le immagini senza distribuzione si basano sulla distribuzione CBL-Mariner 2.0 da parte 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.

L'oggetto ENTRYPOINT di queste immagini è già configurato che punta al java comando . L'utilizzo dei Dockerfile deve usare l'istruzione CMD per completare gli argomenti della riga di comando del processo di avvio di JVM.

Creare un Dockerfile con il contenuto seguente:

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

COPY app.jar /app.jar

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

Usare un'immagine 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-17-amd64
ENV PATH "${JAVA_HOME}/bin:${PATH}"
COPY --from=mcr.microsoft.com/openjdk/jdk:17-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.

Immagini alpine

Anche se Microsoft non produce immagini basate su Alpine, microsoft fornisce 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.

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:17-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-17-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:17-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 le en_US.UTF-8 impostazioni locali. 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 le pt_BR.UTF-8 impostazioni locali in un'immagine basata su Ubuntu, è possibile aggiungere le righe seguenti al 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 e 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. I tag non vengono pubblicati per le versioni secondarie e i tag di versione principale hanno sempre la versione secondaria più recente per garantire che gli sviluppatori abbiano sempre 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 determinata versione, è necessario usare strumenti come apt-get o yum per installare la versione secondaria specifica di JDK.

Per installare versioni specifiche in diverse immagini del sistema operativo di base, ad esempio debian:buster-slim, è possibile usare lo stesso approccio nella prima fase di una compilazione dell'immagine del contenitore in 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.15+10-LTS-1 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages
msopenjdk-11 | 11.0.14.1+1-LTS-31205 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages
msopenjdk-11 | 11.0.14+9-LTS-1 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages
msopenjdk-11 | 11.0.13+8-LTS-1 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages
msopenjdk-11 | 11.0.12+7-1 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages
msopenjdk-11 | 11.0.11+9-1 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages
msopenjdk-11 | 11.0.10+9-1 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages

Questo esempio di Bash mostra come ripristinare una versione precedente dell'immagine msopenjdk-11 , ad esempio 11.0.11+9-1:

root@dd24eca5bdb3:/# 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@dd24eca5bdb3:/# apt-cache madison msopenjdk-11
msopenjdk-11 | 11.0.15+10-LTS-1 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages
msopenjdk-11 | 11.0.14.1+1-LTS-31205 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages
msopenjdk-11 | 11.0.14+9-LTS-1 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages
msopenjdk-11 | 11.0.13+8-LTS-1 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages
msopenjdk-11 | 11.0.12+7-1 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages
msopenjdk-11 | 11.0.11+9-1 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages
msopenjdk-11 | 11.0.10+9-1 | https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages

root@dd24eca5bdb3:/# apt-get -y install -y --allow-downgrades msopenjdk-11=11.0.11+9-1
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be DOWNGRADED:
  msopenjdk-11
0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 17 not upgraded.
Need to get 193 MB of archives.
After this operation, 353 kB disk space will be freed.
Get:1 https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 msopenjdk-11 amd64 11.0.11+9-1 [193 MB]
Fetched 193 MB in 6s (30.9 MB/s)
debconf: delaying package configuration, since apt-utils is not installed
dpkg: warning: downgrading msopenjdk-11 from 11.0.14+9-LTS-1 to 11.0.11+9-1
(Reading database ... 5936 files and directories currently installed.)
Preparing to unpack .../msopenjdk-11_11.0.11+9-1_amd64.deb ...
Unpacking msopenjdk-11 (11.0.11+9-1) over (11.0.14+9-LTS-1) ...
Setting up msopenjdk-11 (11.0.11+9-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.11+9-1
...

Questo esempio di Bash usa immagini CBL-Mariner basate:

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.10+9-1
Loaded plugin: tdnfrepogpgcheck

Downgrading:
msopenjdk-11      x86_64      11.0.10+9-1      packages-microsoft-com-prod      308.38M 323358496

Total installed size: 308.38M 323358496

Downloading:
Testing transaction
Running transaction
Installing/Updating: msopenjdk-11-11.0.10+9-1.x86_64
Removing: msopenjdk-11-11.0.12+7-1.x86_64

Complete!

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.10+9-1
...

Immagini basate su 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.