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 Ubuntu e Microsoft CBL-Mariner. As imagens são publicadas no Microsoft Container Registry localizado em mcr.microsoft.com/openjdk/jdk.

Para extrair a imagem mais recente de uma marca específica, use o seguinte comando:

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

A tabela a seguir mostra a tag a ser usada para sua distribuição Linux e versão 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 Distroless 21-distroless 17-distroless 11-distroless 8-distroless

Nota:As imagens do OpenJDK 8 são enviadas com binários do Eclipse Temurin, do projeto Eclipse Adoptium .

Arquiteturas

As imagens acima são oferecidas para ambas as amd64 arquiteturas arm64 . O tempo de execução do contêiner deve extrair a imagem correta 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:17-mariner

Para forçar uma arquitetura dentro de um Dockerfile, você pode usar o seguinte:

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

Para obter mais informações sobre como criar imagens de contêiner multiplataforma, consulte a documentação do tempo de execução do contêiner. Por exemplo, Docker e Podman.

Como usar essas imagens

Crie um Dockerfile com o seguinte conteúdo:

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

Sem distração

As imagens sem distribuição 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 Linux completa, não há shell, por exemplo.

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

Crie um Dockerfile com o seguinte conteúdo:

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

COPY app.jar /app.jar

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

Usar uma imagem diferente do sistema operacional base

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

Você também pode instalar o JDK usando ou yumapt-get, ou simplesmente extraindo um tar.gz arquivo e configurando JAVA_HOME de acordo. Ler Mais.

Imagens alpinas

Embora a Microsoft não produza imagens baseadas na Alpine, nós fornecemos 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 Alpine Linux usando nossos binários.

Crie um Dockerfile com o seguinte conteúdo:

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 tempo de execução Java personalizado

Para criar uma imagem de tempo de execução 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: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 obter mais informações sobre como criar runtimes Java personalizados, consulte Java Runtimes with 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:17-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, já que as imagens permanecem com root por padrão. O aplicativo, em seguida, é executado como app. A pasta /home/app também é de propriedade do usuário app, dando ao aplicativo um sistema de arquivos gravável.

Localidade padrão

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

Por exemplo, para usar a pt_BR.UTF-8 localidade em uma imagem baseada no Ubuntu, você pode adicionar as seguintes linhas ao seu 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 e não se destina a sugerir as configurações mais ideais.

Fique em versões secundárias mais antigas

Microsoft Build de imagens de contêiner OpenJDK só estão disponíveis sob as tags listadas anteriormente. Não publicamos tags para versões secundárias, e as tags de versão principal sempre têm a versão secundária mais recente para garantir que os desenvolvedores sempre 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 Linux para instalar o pacote JDK. Portanto, para permanecer em uma versão específica, você precisará usar ferramentas como apt-get ou yum instalar a versão secundária específica do JDK.

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

Para CBL-Mariner e outras imagens do sistema operacional baseadas em RPM/yum, consulte os detalhes fornecidos posteriormente 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 exemplo Bash a seguir mostrando comandos e saída. Os comandos mostrados aqui assumem 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.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

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

Este exemplo do Bash usa CBL-Mariner imagens baseadas:

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

Imagens baseadas no Windows

No momento, não fornecemos imagens de contêiner baseadas no Windows.

Fornecer comentários sobre o Microsoft Build do OpenJDK

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.