Compartilhar via


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 Microsoft CBL-Mariner, agora conhecido como Linux do Azure. As imagens são publicadas no Registro de Artefatos da Microsoft localizado em mcr.microsoft.com/openjdk/jdk.

Para baixar a imagem mais recente de um tag específico, use o seguinte comando:

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 navio OpenJDK 8 com binários do Eclipse Temurin, do projeto Eclipse Adoptium .

Arquiteturas

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

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

Para forçar uma arquitetura dentro de uma Dockerfile, você pode usar 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 distroless são baseadas na distribuição CBL-Mariner 2.0 da Microsoft. Eles 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.

Essas ENTRYPOINT imagens já estão configuradas apontando para o java comando. O consumo dos Dockerfiles deve usar a CMD instrução para concluir os argumentos de linha de comando do processo de inicialização da 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 base do sistema operacional diferente, poderá copiar o JDK de uma imagem pré-criada existente usando a COPY --from instrução 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 extraindo um arquivo tar.gz e configurando JAVA_HOME de acordo. Leia 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 suas próprias Dockerfiles. Para referência, o abaixo Dockerfile 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 alpinas

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

Os usuários são bem-vindos para criar imagens de contêiner para o Linux alpino 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 execução personalizada do Java, 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 Java Runtimes com jlink

Usuário não raiz

As imagens vêm com um app usuário 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 en_US.UTF-8 localização. Se você quiser usar uma localidade diferente ou uma imagem base diferente, 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 o pt_BR.UTF-8 local em uma imagem baseada em Ubuntu, você pode 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. Não é para sugerir as configurações mais ideais.

Fique em versões secundárias mais antigas

As imagens de contêiner do OpenJDK, construídas pela Microsoft, estão disponíveis somente sob as tags listadas anteriormente. Não fornecemos marcas para versões secundárias e as principais marcas de versão sempre têm a versão secundária mais recente para garantir que os desenvolvedores tenham a atualização mais recente para qualquer versão principal.

Essas imagens base usam o mecanismo de 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, você precisará usar ferramentas como apt-get ou yum instalar a versão secundária específica do JDK.

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

Para CBL-Mariner e outras imagens do sistema operacional com base em RPM/yum, veja os detalhes fornecidos mais à frente 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, como mostrado no seguinte exemplo de Bash, com comandos e resultados. Os comandos mostrados aqui pressupõem 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) ...

Para fazer a mesma coisa em seu Dockerfile, use os seguintes comandos:

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

Para fazer a mesma coisa em seu Dockerfile, use os seguintes comandos:

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 reconstruídas 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 deste cronograma de reconstrução:

  • Atualizações de segurança oportunas: Ao recompilar as imagens três vezes por semana, garantimos que todas as novas vulnerabilidades de segurança sejam resolvidas rapidamente.
  • Estabilidade aprimorada: As 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 este cronograma antes de abrir um tíquete de suporte.

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

Verificar assinaturas de imagem de contêiner

Para verificar as assinaturas de imagem de contêiner, primeiro instale os seguintes pré-requisitos:

Em seguida, execute as seguintes etapas:

  1. Adicione o certificado ao repositório de confiança usando o seguinte comando:

    notation cert add --type ca --store supplychain msft_supply_chain.crt
    
  2. Configure políticas de confiança criando um arquivo trustpolicy.json com o seguinte conteúdo:

    {
        "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. Importe a política de confiança usando o seguinte comando:

    notation policy import trustpolicy.json
    
  4. Verifique a imagem usando o seguinte comando:

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

    A seguinte saída deve ser exibida:

    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
    

Imagens baseadas no Windows

Atualmente, não fornecemos 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.