OpenJDK 的Microsoft版本的容器映像

本文提供有关 OpenJDK Microsoft版本的可用容器映像的信息。

基于 Linux 的映像

我们目前为 Ubuntu 和 Microsoft CBL-Mariner 提供基于 Linux 的容器映像,现在称为 Azure Linux。 映像发布在位于的Microsoft Artifact Registrymcr.microsoft.com/openjdk/jdk

若要拉取特定标记的最新映像,请使用以下命令:

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

下表显示了用于 Linux 分发版和 JDK 版本的标记。

基本 OS OpenJDK 21 OpenJDK 17 OpenJDK 11 OpenJDK 8
Ubuntu 22.04 21-ubuntu 17-ubuntu 11-ubuntu 空值
CBL Mariner 2.0 21-mariner 17-mariner 11-mariner 8-mariner
CBL-Mariner 2.0 无发行版 21-distroless 17-distroless 11-distroless 8-distroless

注意:OpenJDK 8 的图像随附来自 Eclipse Adoptium 项目 的 Eclipse Temurin 二进制文件。

体系结构

上述映像同时适用于amd64arm64体系结构。 容器运行时应根据环境拉取正确的映像。 若要强制拉取特定体系结构的镜像,请利用以下命令:

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

若要在 Dockerfile中执行特定体系结构,可以使用以下内容:

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

有关生成多平台容器映像的详细信息,请查看容器运行时的文档。 例如 DockerPodman

如何使用这些图像

创建包含以下内容的 Dockerfile:

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

无发行版

这些精简版映像基于 Microsoft 的 CBL-Mariner 2.0 分发版。 部署应用程序需要不同的方法。 例如,由于无发行版映像不包含完整的 Linux 分发版,因此没有 shell。

这些 ENTRYPOINT 图像已经配置为指向 java 命令。 使用Dockerfiles时,必须使用CMD指令来完成 JVM 启动进程的命令行参数。

创建包含以下内容的 Dockerfile:

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

COPY app.jar /app.jar

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

使用不同的基本 OS 映像或版本

如果想要使用不同的 OS 基础镜像发行版,可以在 Dockerfile 中使用 COPY --from 指令从现有的预生成镜像中复制 JDK,类似于以下示例:

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

还可以通过使用yumapt-get来安装 JDK,或者简单地提取tar.gz文件并相应地配置JAVA_HOME了解详细信息

使用不同版本的 Ubuntu

若要在不同版本的 Ubuntu 基础映像上部署 Microsoft 的 OpenJDK 版本,Microsoft 建议用户自行编写 Dockerfiles。 以下 Dockerfile 创建了一个使用 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"]

阿尔卑斯的图像

虽然 Microsoft 不提供基于 Alpine 的映像,但我们确实为 Alpine Linux 提供了一组有限的 musl 编译的 JDK 二进制文件。

欢迎用户使用可用的二进制文件为 Alpine Linux 创建容器映像。

创建包含以下内容的 Dockerfile:

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

创建自定义 Java 运行时

若要创建定制的 Java 运行时映像,请使用类似于以下示例的多阶段 Dockerfile。

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

有关创建自定义 Java 运行时的详细信息,请参阅 使用 jlink 的 Java 运行时

非root用户

映像附带一个 app 用户,该用户可以被选择性启用和被使用层使用。

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

在上面的示例中,应用程序二进制文件被复制为 root,因为图像默认保持不变 root 。 然后,应用程序将执行为 app. 该文件夹 /home/app 也由用户 app拥有,为应用程序提供可写文件系统。

默认区域设置

默认情况下,Microsoft Build 的 OpenJDK 映像使用en_US.UTF-8区域设置进行配置。 如果要使用不同的语言环境或如前面所述的不同基础镜像,则需要在自己的 Dockerfile 中手动配置环境变量,并确保已安装所需的语言环境。

例如,为了在 Ubuntu 镜像上使用 pt_BR.UTF-8 的区域设置,您可以将以下几行添加到您的 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
...

此 Dockerfile 是一个示例。 它并不意味着建议最佳配置。

保留较旧的次要版本

Microsoft OpenJDK 容器映像的生成仅在前面列出的标记下可用。 我们不提供次要版本的标记,并且主版本标记始终具有最新的次要版本,以确保开发人员具有任何给定主版本的最新更新。

这些基本映像使用 Linux 分发版的基础包管理器机制来安装 JDK 包。 因此,若要继续使用特定的较旧版本,您需要使用 apt-getyum 等工具来安装 JDK 的特定次要版本。

例如,若要在提供映像列表之外回滚到不同基础 OS 映像上的特定版本, debian:buster-slim可以在 muli 阶段容器映像生成的第一阶段或作为传统 Linux 包安装流的一部分使用以下相同方法。 有关详细信息,请参阅安装在 Ubuntu 18.04+ 部分安装 Microsoft Build 的 OpenJDK

如需了解 CBL-Mariner 及其他基于 RPM/yum 的操作系统映像,请查看本文后面提供的详细信息。

对于 Ubuntu 和其他基于 Debian 的映像,可以显示 Microsoft Linux 存储库中发布的所有可用次要版本。以下 Bash 示例演示了命令及其输出。 此处显示的命令假定已配置 Microsoft Linux 存储库,如 Ubuntu 18.04+ 上的 Install 中所述。

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

此 Bash 示例演示如何将映像还原 msopenjdk-11 到旧版本,例如 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) ...

若要在 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
...

此 Bash 示例使用基于 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

若要在 Dockerfile 中执行相同的操作,请使用以下命令:

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

容器映像重新生成计划

为了确保最高级别的安全性和稳定性,每个星期一、星期三和星期五都会重新生成容器映像。 此定期重建计划使我们能够及时整合最新的安全补丁和更新。

您可以期待从这个重建计划中获得以下优势:

  • 及时安全更新: 通过每周三次重新生成映像,我们可确保快速解决任何新的安全漏洞。
  • 改进了稳定性: 常规更新通过包括最新的 bug 修复和改进来帮助维护应用程序的稳定性和性能。

如果遇到与这些更新相关的任何问题,请在开具支持票证之前参阅此计划。

有关支持策略的详细信息,请参阅 OpenJDK 的Microsoft版本的支持路线图

验证容器映像签名

若要验证容器映像签名,请先安装以下先决条件:

然后,使用以下步骤:

  1. 使用以下命令将证书添加到信任存储:

    notation cert add --type ca --store supplychain msft_supply_chain.crt
    
  2. 通过创建包含以下内容的 trustpolicy.json 文件来配置信任策略:

    {
        "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. 使用以下命令导入信任策略:

    notation policy import trustpolicy.json
    
  4. 使用以下命令验证映像:

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

    应会看到以下输出:

    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
    

基于 Windows 的映像

我们目前不提供基于 Windows 的容器映像。

提供有关 Microsoft Build of OpenJDK 的反馈

向我们发送你的评论、想法和意见,帮助我们改进 Microsoft Build of OpenJDK。 请访问 GitHub 上的 OpenJDK 讨论页面 ,向我们发送反馈。

Java 和 OpenJDK 是 Oracle 及其关联公司的商标或注册商标。