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

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

Linux ベースのイメージ

現在、Ubuntu 20.04 および 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 マリナー 1.0 N/A 17-mariner-cm1 11-mariner-cm1 N/A
CBL-Mariner 2.0 ディストリビューションレス 21-distroless 17-distroless 11-distroless 8-distroless

注:OpenJDK 8 のイメージには、 Eclipse Adoptium プロジェクトの Eclipse Temurin のバイナリが付属しています。

アーキテクチャ

上記の画像は、 と arm64 の両方amd64のアーキテクチャで提供されています。 コンテナー ランタイムは、環境に基づいて適切なイメージをプルします。 特定のアーキテクチャのイメージを強制的にプルするには、次の値を使用します。

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

または apt-getを使用して yum 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 パッケージをインストールします。 そのため、特定のバージョンを維持するには、 や yum などのapt-getツールを使用して、特定のマイナー バージョンの JDK をインストールする必要があります。

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

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

、およびその他の Debian ベースのイメージの Ubuntu場合は、コマンドと出力を示す次の 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 やその関連会社の商標または登録商標です。