Gambar kontainer untuk Microsoft Build of OpenJDK

Artikel ini menyediakan informasi tentang gambar kontainer yang tersedia untuk Microsoft Build of OpenJDK.

Gambar berbasis Linux

Saat ini kami menyediakan gambar kontainer berbasis Linux untuk Ubuntu 20.04 dan Microsoft CBL-Mariner. Gambar diterbitkan di Microsoft Container Registry yang terletak di mcr.microsoft.com/openjdk/jdk.

Untuk menarik gambar terbaru untuk tag tertentu, gunakan perintah berikut:

docker pull mcr.microsoft.com/openjdk/jdk:<tag>

Tabel berikut menunjukkan tag yang akan digunakan untuk distribusi Linux dan versi JDK Anda.

OS Dasar 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 1.0 N/A 17-mariner-cm1 11-mariner-cm1 N/A
CBL-Mariner 2.0 Distroless 21-distroless 17-distroless 11-distroless 8-distroless

Catatan:Gambar untuk OpenJDK 8 dikirim dengan biner Eclipse Temurin, dari proyek Eclipse Adoptium.

Arsitektur

Gambar di atas ditawarkan untuk arsitektur amd64 dan arm64 . Runtime kontainer Anda akan menarik gambar yang tepat berdasarkan lingkungan Anda. Untuk memaksa tarikan gambar untuk arsitektur tertentu, gunakan yang berikut ini:

$ docker pull --platform=linux/arm64 mcr.microsoft.com/openjdk/jdk:17-mariner

Untuk memaksa arsitektur di dalam Dockerfile, Anda dapat menggunakan yang berikut ini:

FROM --platform=linux/arm64 mcr.microsoft.com/openjdk/jdk:17-mariner AS build
# ...

Untuk informasi selengkapnya tentang membangun gambar kontainer multi-platform, periksa dokumentasi runtime kontainer Anda. Misalnya, Docker dan Podman.

Cara menggunakan gambar-gambar ini

Buat Dockerfile dengan konten berikut:

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

Distroless

Gambar distroless didasarkan pada distribusi CBL-Mariner 2.0 oleh Microsoft. Mereka memerlukan pendekatan yang berbeda untuk menyebarkan aplikasi. Karena gambar distroless tidak berisi distribusi Linux lengkap, tidak ada shell, misalnya.

Dari ENTRYPOINT gambar-gambar ini sudah dikonfigurasi menunjuk ke java perintah . Menggunakan Dockerfiles harus menggunakan CMD instruksi untuk menyelesaikan argumen baris perintah dari proses peluncur JVM.

Buat Dockerfile dengan konten berikut:

FROM mcr.microsoft.com/openjdk/jdk:17-distroless

COPY app.jar /app.jar

CMD ["-Xmx256m", "-jar", "/app.jar"]

Menggunakan gambar OS Dasar yang berbeda

Jika Anda lebih suka menggunakan distribusi gambar dasar OS yang berbeda, Anda dapat menyalin JDK dari gambar bawaan yang ada menggunakan COPY --from instruksi di Dockerfile, mirip dengan contoh berikut:

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

Anda juga dapat menginstal JDK menggunakan yum atau apt-get, atau hanya mengekstrak tar.gz file dan mengonfigurasi JAVA_HOME yang sesuai. Baca selengkapnya.

Gambar Alpine

Meskipun Microsoft tidak menghasilkan gambar berbasis Alpine, kami menyediakan biner JDK yang dikompilasi musl untuk Alpine Linux.

Pengguna dipersilakan untuk membuat gambar kontainer untuk Alpine Linux menggunakan biner kami.

Buat Dockerfile dengan konten berikut:

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

Membuat runtime Java kustom

Untuk membuat gambar runtime Java kustom, gunakan Dockerfile multi-tahap yang mirip dengan contoh berikut:

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

Untuk informasi selengkapnya tentang membuat runtime Java kustom, lihat Java Runtime dengan jlink

Pengguna non-root

Gambar dilengkapi dengan app pengguna yang dapat diaktifkan dan digunakan secara opsional dengan menggunakan lapisan:

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

Dalam contoh di atas, biner aplikasi disalin sebagai root, karena gambar tetap dengan root secara default. Aplikasi kemudian dijalankan sebagai app. Folder /home/app ini juga dimiliki oleh pengguna app, memberi aplikasi sistem file yang dapat ditulis.

Lokal Default

Gambar untuk Microsoft Build of OpenJDK dikonfigurasi secara default dengan en_US.UTF-8 lokal. Jika Anda ingin menggunakan lokal yang berbeda, atau gambar dasar yang berbeda seperti yang dijelaskan sebelumnya, Anda harus mengonfigurasi variabel lingkungan secara manual di Dockerfile Anda sendiri, dan memastikan lokal yang Anda inginkan diinstal.

Misalnya, untuk menggunakan pt_BR.UTF-8 lokal pada gambar berbasis Ubuntu, Anda dapat menambahkan baris berikut ke Dockerfile Anda:

...
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 ini disediakan sebagai contoh, dan tidak dimaksudkan untuk menyarankan konfigurasi yang paling optimal.

Tetap pada versi minor yang lebih lama

Gambar kontainer Microsoft Build of OpenJDK hanya tersedia di bawah tag yang tercantum sebelumnya. Kami tidak menerbitkan tag untuk versi minor, dan tag versi utama selalu memiliki versi minor terbaru untuk memastikan bahwa pengembang akan selalu memiliki pembaruan terbaru untuk versi utama tertentu.

Gambar dasar ini menggunakan mekanisme manajer paket yang mendasar dari distribusi Linux untuk menginstal paket JDK. Oleh karena itu, untuk tetap menggunakan versi tertentu, Anda harus menggunakan alat seperti apt-get atau yum untuk menginstal JDK versi minor tertentu.

Untuk menginstal versi tertentu pada gambar OS dasar yang berbeda, misalnya debian:buster-slim, Anda dapat menggunakan pendekatan yang sama baik pada tahap pertama build gambar kontainer tahap muli, atau sebagai bagian dari alur penginstalan paket Linux tradisional. Untuk informasi selengkapnya, lihat Instal di Ubuntu 18.04+ bagian dari Instal Microsoft Build of OpenJDK.

Untuk CBL-Mariner dan gambar OS lainnya berdasarkan RPM/yum, lihat detail yang disediakan nanti di artikel ini.

Untuk Ubuntu, dan gambar berbasis Debian lainnya, Anda dapat menampilkan semua versi minor yang tersedia yang diterbitkan di repositori Microsoft Linux, seperti yang ditunjukkan dalam contoh Bash berikut yang menunjukkan perintah dan output. Perintah yang ditampilkan di sini mengasumsikan repositori Microsoft Linux dikonfigurasi, seperti yang dijelaskan di Instal di 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.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

Contoh Bash ini menunjukkan cara mengembalikan gambar Anda msopenjdk-11 ke versi yang lebih lama, katakan 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) ...

Untuk melakukan hal yang sama di Dockerfile Anda, gunakan perintah berikut:

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

Contoh Bash ini menggunakan CBL-Mariner gambar berbasis:

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!

Untuk melakukan hal yang sama di Dockerfile Anda, gunakan perintah berikut:

FROM mcr.microsoft.com/openjdk/jdk:11-mariner
...
RUN yum update && \
    yum install -y --nogpgcheck msopenjdk-11-11.0.10+9-1
...

Gambar berbasis Windows

Saat ini kami tidak menyediakan gambar kontainer berbasis Windows.

Memberikan umpan balik tentang Microsoft Build of OpenJDK

Kirimi kami komentar, pemikiran, dan ide Anda untuk membantu kami meningkatkan Microsoft Build of OpenJDK. Kunjungi halaman diskusi OpenJDK kami di GitHub untuk mengirimkan umpan balik Anda kepada kami.

Java dan OpenJDK merupakan merek dagang yang terdaftar dari Oracle dan/atau afiliasinya.