Imagens de contêiner para o Microsoft Build do OpenJDK

Este artigo fornece informações sobre as imagens de contêiner disponíveis para o Microsoft Build do OpenJDK.

Imagens baseadas em Linux

Atualmente, fornecemos imagens de contêiner baseadas em Linux para o Ubuntu e o CBL-Mariner da Microsoft Corporation, agora conhecido como Linux do Azure. As imagens são publicadas no Registro de Artefato da Microsoft localizado em mcr.microsoft.com/openjdk/jdk.

Para efetuar pull da imagem mais recente para uma marca específica, use o comando a seguir:

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

A tabela a seguir mostra a marca a ser usada para a distribuição do Linux e a versão do JDK.

Sistema operacional 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 sem distribuição 21-distroless 17-distroless 11-distroless 8-distroless

Observação: Imagens para o OpenJDK 8 enviar com os binários do Eclipse Temurin, do projeto Eclipse Adoptium.

Arquiteturas

As imagens acima são oferecidas para as duas arquiteturas amd64 e arm64. O runtime do contêiner deve efetuar pull da imagem certa com base em seu ambiente. Para forçar um pull de uma imagem para uma arquitetura específica, use o seguinte:

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

Para forçar uma arquitetura dentro de um Dockerfile, use o seguinte:

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

Para obter mais informações sobre como criar imagens de contêiner de várias plataformas, verifique a documentação do runtime do contêiner. Por exemplo, Docker e Podman.

Como usar essas imagens

Crie um Dockerfile com o conteúdo a seguir:

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

Sem distribuição

As imagens sem distribuição são baseadas na distribuição CBL-Mariner 2.0 da Microsoft. Elas exigem uma abordagem diferente para implantar um aplicativo. Como as imagens sem distribuição não contêm uma distribuição completa do Linux, não há nenhum shell, por exemplo.

O ENTRYPOINT dessas imagens já estão configurados apontando para o comando java. O consumo de Dockerfiles deve usar a instrução CMD para concluir os argumentos de linha de comando do processo do inicializador de JVM.

Crie um Dockerfile com o conteúdo a seguir:

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

COPY app.jar /app.jar

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

Usar uma imagem ou versão do sistema operacional base diferente

Se você preferir usar uma distribuição de imagem do sistema operacional base diferente, poderá copiar o JDK de uma imagem pré-criada existente usando a instrução COPY --from em um Dockerfile, semelhante ao exemplo a seguir:

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

Você também pode instalar o JDK usando yum ou apt-get, ou simplesmente extrair um arquivo tar.gz e configurar JAVA_HOME de acordo. Ler Mais.

Usar uma versão diferente do Ubuntu

Para implantar o Microsoft Build do OpenJDK em diferentes versões de imagens base do Ubuntu, a Microsoft recomenda que os usuários criem os próprios Dockerfiles. Para referência, o Dockerfile abaixo cria uma imagem com o 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"]

Imagens do Alpine

Embora a Microsoft não forneça imagens baseadas no Alpine, fornecemos um conjunto limitado de binários JDK compilados por musl para o Alpine Linux.

Convidamos os usuários a criar imagens de contêiner para o Alpine Linux usando os binários disponíveis.

Crie um Dockerfile com o conteúdo a seguir:

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

Criar um runtime personalizado do Java

Para criar uma imagem de runtime do Java personalizada, use um Dockerfile de vários estágios semelhante ao exemplo a seguir:

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

Para obter mais informações sobre como criar runtimes Java personalizados, consulte Runtimes Java com jlink

Usuário não raiz

As imagens vêm com um usuário app que pode ser opcionalmente habilitado e usado consumindo camadas:

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

No exemplo acima, o binário do aplicativo é copiado como root, uma vez que as imagens permanecem com root por padrão. Em seguida, o aplicativo é executado como app. A pasta /home/app também pertence ao usuário app, dando ao aplicativo um sistema de arquivos gravável.

Localidade padrão

As imagens do Microsoft Build do OpenJDK são configuradas por padrão com a localidade en_US.UTF-8. Se desejar usar uma localidade ou uma imagem base diferentes, conforme descrito anteriormente, será necessário configurar manualmente variáveis de ambiente em seu próprio Dockerfile e verificar se a localidade desejada está instalada.

Por exemplo, para usar a localidade pt_BR.UTF-8 em uma imagem baseada em Ubuntu, é possível adicionar as seguintes linhas ao 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 é fornecido como um exemplo. Ele não serve para sugerir as melhores configurações.

Ficar em versões secundárias mais antigas

As imagens de contêiner do Microsoft Build do OpenJDK está disponível somente nas marcas listadas anteriormente. Não fornecemos marcas para versões secundárias e as marcas de versão principal sempre têm a versão secundária mais recente para garantir que os desenvolvedores tenham a atualização mais recente para toda versão principal.

Essas imagens base usam o mecanismo do gerenciador de pacotes subjacente das distribuições do Linux para instalar o pacote JDK. Portanto, para permanecer em uma versão mais antiga específica, será necessário usar ferramentas como apt-get ou yum para instalar a versão secundária específica do JDK.

Para reverter para versões específicas em diferentes imagens do sistema operacional base de fora da lista de imagens fornecidas, por exemplo debian:buster-slim, é possível usar a mesma abordagem abaixo no primeiro estágio de um build de imagem de contêiner em vários estágios ou como parte de um fluxo de instalação de pacote do Linux tradicional. Para obter mais informações, consulte a seção Instalar no Ubuntu 18.04+ do Instalar o Microsoft Build do OpenJDK.

Para CBL-Mariner e outras imagens do sistema operacional com base em RPM/yum, consulte os detalhes fornecidos mais tarde neste artigo.

Para Ubuntu e outras imagens baseadas em Debian, você pode exibir todas as versões secundárias disponíveis publicadas nos repositórios do Microsoft Linux, conforme mostrado no exemplo Bash a seguir mostrando comandos e saída. Os comandos mostrados aqui consideram que o repositório do Microsoft Linux está configurado, conforme descrito em Instalar no 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
...

Este exemplo do Bash mostra como fazer com que sua imagem seja revertida msopenjdk-11 para uma versão mais antiga, digamos 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) ...

Use os seguintes comandos para fazer a mesma coisa em seu Dockerfile:

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

Este exemplo do Bash usa imagens baseadas em 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

Use os seguintes comandos para fazer a mesma coisa em seu Dockerfile:

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

Agendamento de recompilação de imagem de contêiner

Para garantir o mais alto nível de segurança e estabilidade, nossas imagens de contêiner são recompiladas todas as segundas, quartas e sextas-feiras. Esse agendamento de recompilação regular nos permite incorporar prontamente os patches e atualizações de segurança mais recentes.

Você pode esperar os seguintes benefícios desta agenda de recompilação:

  • Atualizações de segurança em tempo hábil: ao recompilar as imagens três vezes por semana, garantimos que todas as novas vulnerabilidades de segurança sejam resolvidas rapidamente.
  • Estabilidade aprimorada: atualizações regulares ajudam a manter a estabilidade e o desempenho de seus aplicativos, incluindo as correções e melhorias de bugs mais recentes.

Se você tiver dúvidas ou encontrar problemas relacionados a essas atualizações, consulte esse agendamento antes de abrir um tíquete de suporte.

Para obter mais informações sobre nossas políticas de suporte, consulte Roteiro de suporte para o Microsoft Build do OpenJDK.

Imagens baseadas no Windows

Atualmente, não são fornecidas imagens de contêiner baseadas no Windows.

Fornecer comentários sobre o Build do OpenJDK da Microsoft

Envie-nos seus comentários, pensamentos e ideias para nos ajudar a melhorar o Microsoft Build do OpenJDK. Visite nossa página de discussões do OpenJDK no GitHub para nos enviar seus comentários.

Java e OpenJDK são marcas ou marcas registradas da Oracle e/ou de suas afiliadas.