分享方式:


Microsoft 版 OpenJDK 的容器映像

本文提供有關 Microsoft 的 OpenJDK 構建的可用容器映像的信息。

以 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 版本的標記。

基礎作業系統 OpenJDK 21 OpenJDK 17 OpenJDK 11 OpenJDK 8
Ubuntu 22.04 版本 21-ubuntu 17-ubuntu 11-ubuntu N/A
CBL 水手 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版本

若要將 Microsoft 的 OpenJDK 組建部署在不同版本的 Ubuntu 基底映像上,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 執行時間

非根使用者

影像隨附 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,您可以使用相同的方法,這些方法可以應用於多階段容器映像組建的第一個階段,或作為傳統Linux套件安裝流程的一部分。 如需詳細資訊,請參閱《安裝 Microsoft 構建的 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
...

容器映像重建排程

為了確保最高層級的安全性與穩定性,我們的容器映像會在每個星期一、星期三和星期五重建。 此定期重建排程可讓我們立即納入最新的安全性修補程式和更新。

您可以預期此重建排程會有下列優點:

  • 及時的安全性更新: 藉由每周重建映像三次,我們可確保快速解決任何新的安全性弱點。
  • 改善穩定性: 定期更新可藉由包含最新的錯誤修正和改進,協助維護應用程式的穩定性和效能。

如果您有任何疑問或遇到與這些更新相關的問題,請先參閱此時間表,再開啟支援工單。

如需支持原則的詳細資訊,請參閱 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 為基礎的容器映像。

提供 OpenJDK Microsoft組建的意見反應

將您的意見、想法和想法傳送給我們,以協助我們改善 OpenJDK 的Microsoft組建。 請流覽 GitHub 上的 OpenJDK 討論頁面 ,以傳送意見反應給我們。

Java 和 OpenJDK 是 Oracle 和/或其關聯公司的商標或註冊商標。