Microsoft Build of OpenJDK 的容器映像

本文介绍可用的 Microsoft Build of OpenJDK 容器映像。

基于 Linux 的映像

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

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

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 命令。 使用 Dockerfile 必须使用 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 基础映像上部署 openJDK 的Microsoft 版本,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"]

Alpine 映像

虽然 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 运行时

非根用户

映像随附一个 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 of 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 Build of OpenJDK 容器映像仅在前面列出的标记下可用。 我们不会提供次要版本的标记,但主要版本标记始终具有最新的次要版本,以确保开发人员始终具有任何给定主要版本的最新更新。

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

要在其他基础 OS 映像(例如 debian:buster-slim)上回退到特定版本(在提供的映像列表之外),可在多阶段容器映像生成的第一个阶段或在传统 Linux 包安装流程中使用相同方法。 有关详细信息,请参阅安装 Microsoft Build of OpenJDK在 Ubuntu 18.04+ 上安装部分。

对于 CBL-Mariner 和基于 RPM/yum 的其他 OS 映像,请参阅本文后面提供的详细信息。

对于 Ubuntu 和其他基于 Debian 的映像,可显示 Microsoft Linux 存储库中发布的所有可用次要版本,如以下显示命令和输出的 Bash 示例所示。 此处显示的命令假定已配置 Microsoft Linux 存储库,如在 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
...

以下 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 修复和改进来帮助维护应用程序的稳定性和性能。

如果你有任何疑问或遇到了与这些更新相关的问题,请在开具支持工单之前参阅此计划。

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

基于 Windows 的映像

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

提供有关 Microsoft Build of OpenJDK 的反馈

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

Java 和 OpenJDK 是 Oracle 和/或其附属机构的商标或注册商标。