Microsoft Build of OpenJDK のコンテナー イメージ

この記事では、Microsoft Build of OpenJDK の使用可能なコンテナー イメージについて説明します。

Linux ベースのイメージ

現在、Ubuntu および Microsoft CBL-Mariner (現在は Azure Linux と呼ばれています) 用の 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 N/A
CBL Mariner 2.0 21-mariner 17-mariner 11-mariner 8-mariner
CBL-Mariner 2.0 Distroless 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"]

distroless

distroless イメージは、Microsoft による CBL-Mariner 2.0 ディストリビューションに基づいています。 これらのイメージには、アプリケーションをデプロイするための別のアプローチが必要です。 distroless イメージには完全な Linux ディストリビューションが含まれていないため、たとえばシェルはありません。

これらのイメージの 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"]

また、yum または apt-get を使用して JDK をインストールすることも、単に tar.gz ファイルを抽出し、JAVA_HOME を適切に構成することもできます。 詳細については、こちらを参照してください。

別のバージョンの Ubuntu を使用する

別のバージョンの Ubuntu 基本イメージに Microsoft Build of 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"]

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 パッケージ インストール フローの一部として、以下と同じアプローチを使用できます。 詳細については、「OpenJDK の Microsoft Build をインストールする」の Ubuntu 18.04 以降へのインストールに関するセクションを参照してください。

RPM/yum ベースの CBL-Mariner およびその他の OS イメージについては、この記事で後ほど説明する詳細を参照してください。

Ubuntu、およびその他の Debian ベースのイメージの場合は、コマンドと出力を示す次の Bash の例に示すように、Microsoft Linux リポジトリで公開されている利用可能なすべてのマイナー バージョンを表示できます。 ここで示すコマンドは、Ubuntu 18.04 以降へのインストールに関するセクションで説明されているように、Microsoft Linux リポジトリが構成されていることを前提としています。

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

コンテナー イメージのリビルド スケジュール

最高レベルのセキュリティと安定性を確保するために、コンテナー イメージは毎週月曜日、水曜日、金曜日にリビルドされます。 この定期的なリビルド スケジュールにより、最新のセキュリティ パッチと更新を迅速に組み込むことができます。

このリビルド スケジュールには、次の利点があります。

  • タイムリーなセキュリティ更新: 週に 3 回イメージをリビルドすることで、新しいセキュリティの脆弱性に迅速に対処できます。
  • 安定性の向上: 定期的な更新は、最新のバグ修正と改善を含めることで、アプリケーションの安定性とパフォーマンスを維持するのに役立ちます。

これらの更新に関する質問や問題が発生した場合は、サポート チケットを作成する前に、このスケジュールを参照してください。

サポート ポリシーの詳細については、「Microsoft Build of OpenJDK のサポート ロードマップ」を参照してください。

Windows ベースのイメージ

現在、Windows ベースのコンテナー イメージは提供されていません。

OpenJDK の Microsoft Build に関するフィードバックの提供

OpenJDK の Microsoft Build の改善に役立てるために、ご意見、ご感想、アイデアをお寄せください。 GitHub の OpenJDK ディスカッション ページにアクセスして、フィードバックを送信してください。

Java と OpenJDK は、Oracle やその関連会社の商標または登録商標です。