Microsoft Build of OpenJDK 的容器映像

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

基于 Linux 的映像

我们目前为 Ubuntu 和 Microsoft CBL-Mariner 提供基于 Linux 的容器映像。 这些映像发布在位于 mcr.microsoft.com/openjdk/jdkMicrosoft Container Registry 中。

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

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:17-mariner

要在 Dockerfile 内强制使用某个体系结构,可以使用以下命令:

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

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

如何使用这些映像

创建包含以下内容的 Dockerfile:

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

无分发版

无分发版映像基于 Microsoft 提供的 CBL-Mariner 2.0 分发版。 它们需要使用不同的方法来部署应用程序。 例如,由于无分发版映像不包含完整的 Linux 分发版,因此没有 shell。

这些映像的 ENTRYPOINT 已配置为指向 java 命令。 使用 Dockerfile 必须使用 CMD 指令来完成 JVM 启动器进程的命令行参数。

创建包含以下内容的 Dockerfile:

FROM mcr.microsoft.com/openjdk/jdk:17-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-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"]

还可使用 yumapt-get 安装 JDK,或者只需解压缩 tar.gz 文件并相应地配置 JAVA_HOME了解详细信息

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

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

非根用户

映像随附一个 app 用户,该用户可以选择性地启用并由使用层使用:

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

在上面的示例中,应用程序二进制文件复制为 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.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

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

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

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

以下 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.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!

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

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

基于 Windows 的映像

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

提供有关 Microsoft Build of OpenJDK 的反馈

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

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