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

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

Linux ベースのイメージ

現在、Ubuntu および Microsoft CBL-Mariner 用の Linux ベースのコンテナー イメージが提供されています。 イメージは、次の 場所にある Microsoft Container Registrymcr.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 N/A
CBL マリナー 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: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 ディストリビューションが含まれていないため、たとえばシェルはありません。

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

JDK は、いずれかyumapt-getを使用してインストールすることも、単にファイルを抽出し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 パッケージをインストールします。 そのため、特定のバージョンを維持するには、JDK の特定のマイナー バージョンをインストールするyumなどのapt-getツールを使用する必要があります。

たとえば debian:buster-slim、異なるベース OS イメージに特定のバージョンをインストールするには、muli ステージ のコンテナー イメージ ビルドの最初のステージで、または従来の Linux パッケージ インストール フローの一部として、同じアプローチを使用できます。 詳細については、「Microsoft Build of OpenJDK のインストール」の「Ubuntu 18.04 以降へのインストール」セクションを参照してください。

RPM/yum に基づくその他の OS イメージについては CBL-Mariner 、この記事で後述する詳細を参照してください。

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.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 やその関連会社の商標または登録商標です。