Imágenes de contenedor para Microsoft Build de OpenJDK

En este artículo se proporciona información sobre las imágenes de contenedor disponibles para Microsoft Build de OpenJDK.

Imágenes basadas en Linux

Actualmente se proporcionan imágenes de contenedor basadas en Linux para Ubuntu y Microsoft CBL-Mariner. Las imágenes se publican en Microsoft Container Registry , que se encuentra en mcr.microsoft.com/openjdk/jdk.

Para extraer la imagen más reciente de una etiqueta específica, use el siguiente comando:

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

En la tabla siguiente se muestra la etiqueta que se va a usar para la distribución de Linux y la versión de JDK.

Sistema operativo 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 Distroless 21-distroless 17-distroless 11-distroless 8-distroless

Nota: Imágenes para openJDK 8 con archivos binarios de Eclipse Temurin, del proyecto Eclipse Adoptium .

Arquitecturas

Las imágenes anteriores se ofrecen para arquitecturas amd64 y arm64 . El entorno de ejecución del contenedor extraerá la imagen correcta en función de su entorno. Para forzar una extracción de una imagen para una arquitectura específica, use lo siguiente:

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

Para forzar una arquitectura dentro de , Dockerfilepuede usar lo siguiente:

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

Para más información sobre cómo compilar imágenes de contenedor multiplataforma, consulte la documentación de su entorno de ejecución de contenedor. Por ejemplo, Docker y Podman.

Cómo usar estas imágenes

Cree un Dockerfile con el siguiente contenido:

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

Sin distribución

Las imágenes sin distribución se basan en la distribución CBL-Mariner 2.0 por Parte de Microsoft. Requieren un enfoque diferente para implementar una aplicación. Dado que las imágenes sin distribución no contienen una distribución completa de Linux, no hay ningún shell, por ejemplo.

De ENTRYPOINT estas imágenes ya está configurada que apunta al java comando . El consumo de Dockerfiles debe usar la CMD instrucción para completar los argumentos de la línea de comandos del proceso del iniciador de JVM.

Cree un Dockerfile con el siguiente contenido:

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

COPY app.jar /app.jar

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

Uso de una imagen de sistema operativo base diferente

Si prefiere usar una distribución de imagen base del sistema operativo diferente, puede copiar el JDK de una imagen precompilada existente mediante la COPY --from instrucción en un Dockerfile, similar al ejemplo siguiente:

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

También puede instalar el JDK mediante yum o apt-get, o simplemente extraer un tar.gz archivo y configurarlo JAVA_HOME en consecuencia. Más información.

Imágenes alpinos

Aunque Microsoft no genera imágenes basadas en Alpine, proporcionamos archivos binarios JDK compilados musl para Alpine Linux.

Los usuarios pueden crear imágenes de contenedor para Alpine Linux mediante nuestros archivos binarios.

Cree un Dockerfile con el siguiente contenido:

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

Creación de un entorno de ejecución de Java personalizado

Para crear una imagen en tiempo de ejecución de Java personalizada, use un Dockerfile de varias fases similar al ejemplo siguiente:

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

Para obtener más información sobre cómo crear entornos de ejecución de Java personalizados, consulte Java Runtimes with jlink (Entornos de ejecución de Java con jlink).

Usuario no raíz

Las imágenes incluyen un app usuario que se puede habilitar y usar opcionalmente mediante el consumo de capas:

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

En el ejemplo anterior, el binario de la aplicación se copia como root, ya que las imágenes permanecen con root de forma predeterminada. A continuación, la aplicación se ejecuta como app. La carpeta /home/app también es propiedad del usuario app, lo que proporciona a la aplicación un sistema de archivos que se puede escribir.

Configuración regional predeterminada

Las imágenes de Microsoft Build de OpenJDK se configuran de forma predeterminada con la en_US.UTF-8 configuración regional. Si quiere usar una configuración regional diferente o una imagen base diferente como se ha descrito anteriormente, deberá configurar manualmente las variables de entorno en su propio Dockerfile y asegurarse de que la configuración regional que desee esté instalada.

Por ejemplo, para usar la pt_BR.UTF-8 configuración regional en una imagen basada en Ubuntu, puede agregar las siguientes líneas 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
...

Este Dockerfile se proporciona como ejemplo y no está pensado para sugerir las configuraciones más óptimas.

Mantenerse en versiones secundarias anteriores

Microsoft Build de imágenes de contenedor de OpenJDK solo están disponibles en las etiquetas enumeradas anteriormente. No publicamos etiquetas para versiones secundarias y las etiquetas de versión principal siempre tienen la versión secundaria más reciente para asegurarse de que los desarrolladores siempre tendrán la actualización más reciente para cualquier versión principal determinada.

Estas imágenes base usan el mecanismo del administrador de paquetes subyacente de las distribuciones de Linux para instalar el paquete JDK. Por lo tanto, para mantenerse en una versión determinada, deberá usar herramientas como apt-get o yum para instalar la versión secundaria específica del JDK.

Para instalar versiones específicas en diferentes imágenes del sistema operativo base, por ejemplo debian:buster-slim, puede usar el mismo enfoque en la primera fase de una compilación de imagen de contenedor de la fase muli o como parte de un flujo de instalación de paquetes Linux tradicional. Para obtener más información, consulte la sección Instalar en Ubuntu 18.04+ de Instalación de Microsoft Build of OpenJDK.

Para CBL-Mariner y otras imágenes del sistema operativo basadas en RPM/yum, consulte los detalles que se proporcionan más adelante en este artículo.

En Ubuntuel caso de , y otras imágenes basadas en Debian, puede mostrar todas las versiones secundarias disponibles publicadas en los repositorios de Microsoft Linux, como se muestra en el siguiente ejemplo de Bash que muestra comandos y salidas. Los comandos que se muestran aquí suponen que el repositorio de Microsoft Linux está configurado, como se describe en Instalación en 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

En este ejemplo de Bash se muestra cómo hacer que la imagen vuelva msopenjdk-11 a una versión anterior, por ejemplo 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) ...

Para hacer lo mismo en el Dockerfile, use los siguientes comandos:

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
...

En este ejemplo de Bash se usan CBL-Mariner imágenes basadas:

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!

Para hacer lo mismo en el Dockerfile, use los siguientes comandos:

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

Imágenes basadas en Windows

Actualmente no se proporcionan imágenes de contenedor basadas en Windows.

Proporcionar comentarios sobre Microsoft Build of OpenJDK

Envíenos sus comentarios, pensamientos e ideas para ayudarnos a mejorar Microsoft Build of OpenJDK. Visite nuestra página de discusiones de OpenJDK en GitHub para enviarnos sus comentarios.

Java y OpenJDK son marcas comerciales o marcas registradas de Oracle o sus filiales.