本文提供有关 OpenJDK Microsoft版本的可用容器映像的信息。
基于 Linux 的映像
我们目前为 Ubuntu 和 Microsoft CBL-Mariner 提供基于 Linux 的容器映像,现在称为 Azure Linux。 映像发布在位于的Microsoft Artifact Registry中mcr.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 二进制文件。
体系结构
上述映像同时适用于amd64
和arm64
体系结构。 容器运行时应根据环境拉取正确的映像。 若要强制拉取特定体系结构的镜像,请利用以下命令:
$ 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
# ...
有关生成多平台容器映像的详细信息,请查看容器运行时的文档。 例如 Docker 和 Podman。
如何使用这些图像
创建包含以下内容的 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"]
还可以通过使用yum
或apt-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-get
或 yum
等工具来安装 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版本的支持路线图。
验证容器映像签名
若要验证容器映像签名,请先安装以下先决条件:
- 表示法 CLI
-
msft_supply_chain.crt
- 下载此文件,并使用文件名(如 msft_supply_chain.crt)将其保存到本地计算机。
然后,使用以下步骤:
使用以下命令将证书添加到信任存储:
notation cert add --type ca --store supplychain msft_supply_chain.crt
通过创建包含以下内容的 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" ] } ] }
使用以下命令导入信任策略:
notation policy import trustpolicy.json
使用以下命令验证映像:
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 及其关联公司的商标或注册商标。