Dockerfile 文件
Dockerfile 文件
Dockerfile 是一個 用于構建 Docker 鏡像的腳本文件,本質上是一個包含了一系列命令的純文本文件,這些命令按照順序執行,用于自動化創建鏡像。每一條命令都對應鏡像構建過程中的一個層(Layer)。
Dockerfile 是怎么被使用的
Dockerfile 文件通過 docker build 命令被使用,構建出一個鏡像:
docker build -t my-image-name:tag .
說明:
-t my-image-name:tag:為鏡像指定名稱和標簽(可選).:當前目錄中要包含 Dockerfile 文件
構建成功后,你可以用這個鏡像運行容器:
docker run -d -p 8000:8000 my-image-name:tag
Dockerfile 常用指令說明
| 指令 | 說明 |
|---|---|
FROM |
指定基礎鏡像,必須是第一條有效指令 |
RUN |
執行命令并提交結果,用于安裝軟件包、修改配置等 |
COPY |
將本地文件/目錄復制到鏡像中 |
ADD |
類似 COPY,但支持自動解壓和 URL 下載 |
WORKDIR |
設置工作目錄,相當于 cd |
ENV |
設置環境變量 |
EXPOSE |
聲明容器運行時會監聽的端口 |
CMD |
設置容器啟動時默認執行的命令(可被 docker run 參數覆蓋) |
ENTRYPOINT |
設置容器啟動時的入口點(通常配合 CMD 使用) |
VOLUME |
定義掛載點,用于數據持久化 |
USER |
指定運行容器時的用戶名或 UID |
ARG |
構建時使用的變量,與 ENV 不同,構建完成后不會存在于鏡像中 |
HEALTHCHECK |
定義容器運行時的健康檢查命令 |
ONBUILD |
給基礎鏡像定義觸發器,供繼承鏡像執行 |
SHELL |
更改后續 RUN 等指令的 shell 解釋器 |
Dockerfile 示例
示例1
# 選擇基礎鏡像
FROM python:3.12
# 設置環境變量
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# 設置工作目錄
WORKDIR /app
# 復制本地代碼到容器
COPY . /app/
# 安裝依賴
RUN pip install --upgrade pip && pip install -r requirements.txt
# 聲明暴露的端口
EXPOSE 8000
# 啟動命令
CMD ["python", "app.py"]
EXPOSE 指令說明
EXPOSE 是 Dockerfile 中的指令,用于聲明容器內應用程序計劃監聽的網絡端口。它主要起到文檔化和提示作用,具體如下:
-
聲明端口:
EXPOSE告知 Docker 和用戶,容器內的應用程序將在指定的端口上運行或接受連接。- 語法:
EXPOSE <port> [<port>/<protocol>],例如EXPOSE 80或EXPOSE 53/UDP。 - 默認協議為
TCP,可指定UDP。
-
不影響程序運行:
EXPOSE僅聲明端口,不會改變容器內應用程序的實際行為。- 如果應用程序未在聲明的端口上監聽,
EXPOSE本身不會強制監聽。 - 未聲明端口,應用程序仍可正常監聽其他端口,但用戶需自行查看程序配置或代碼以了解實際使用的端口。
-
文檔化作用:
- 聲明端口使鏡像使用更透明,方便其他開發者或運維人員了解容器預期的工作方式。
- 例如,Web 應用通常聲明
80或443端口,數據庫可能聲明3306(MySQL)或5432(PostgreSQL)。
-
不自動開放端口:
EXPOSE不會使端口自動對外可見。需在運行容器時使用docker run -p <host_port>:<container_port>映射端口,或用-P隨機映射所有暴露端口。- 示例:
docker run -p 8080:80 nginx將容器內 80 端口映射到主機 8080 端口。
示例2
FROM eclipse-temurin:8-jre-noble
ENV TZ=Asia/Shanghai
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone
RUN mkdir -p /app/xxx
ENV APP_DIR=/app/xxx
WORKDIR $APP_DIR
COPY . $APP_DIR/
CMD ["java", "-jar", "/app/xxx/xxx-boot-1.0.0.jar"]
添加注釋
# 使用 Eclipse Temurin 提供的 OpenJDK 8 運行時環境作為基礎鏡像(基于 Ubuntu Noble)
FROM eclipse-temurin:8-jre-noble
# 設置時區為上海(東八區)
ENV TZ=Asia/Shanghai
# 創建時區軟鏈接,設置系統時間為 Asia/Shanghai,并寫入 timezone 文件
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone
# 創建應用目錄 /app/xxx(-p 參數確保父目錄也會被創建)
RUN mkdir -p /app/xxx
# 設置環境變量 APP_DIR,值為應用路徑
ENV APP_DIR=/app/xxx
# 設置工作目錄為 $APP_DIR,后續指令會在此目錄下執行
WORKDIR $APP_DIR
# 將構建上下文目錄下所有文件復制到鏡像內的 $APP_DIR 目錄
COPY . $APP_DIR/
# 設置容器啟動時執行的命令,即運行指定的 jar 包
CMD ["java", "-jar", "/app/xxx/xxx-boot-1.0.0.jar"]
WAR 包程序
如果需要修改 WAR 包中的內容,建議在容器啟動前完成修改。不要等容器運行后再進入容器內部操作。
可以直接使用 WinRAR 或類似工具打開 WAR 包,在壓縮包內修改配置文件或其他資源文件,并保存修改。
這樣可避免在容器中額外操作,簡化部署流程,提高一致性和可維護性。
FROM tomcat:8.5-jre8
# 刪除默認的 Tomcat 應用程序
RUN rm -rf $CATALINA_HOME/webapps/*
# 復制 WAR 文件到 Tomcat 的 webapps 目錄下
COPY xxx.war $CATALINA_HOME/webapps/
# 將日志輸出到 stdout,方便 Docker 容器日志收集器收集
RUN ln -sf /dev/stdout $CATALINA_HOME/logs/catalina.out
# 設置時區為上海
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 暴露 Tomcat 的 HTTP 端口
EXPOSE 8080
# 啟動 Tomcat
CMD ["catalina.sh", "run", "-it"]
構建運行
# 構建鏡像
docker build -t xxx:1.0 .
# 使用鏡像創建并啟動一個容器實例
docker run --name xxx -d -p 8080:8080 --restart always xxx:1.0
# 多行寫法
docker run -d \
--name xxx \
-restart always \
-p 8080:8080 \
xxx:1.0
示例3
# 使用 CondaForge Miniforge3 基礎鏡像
FROM condaforge/miniforge3:24.9.2-0
# 設置時區
ENV TZ=Asia/Shanghai
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone
# 設置工作目錄
WORKDIR /app
# 復制本地文件到容器中的 /app 目錄
COPY ./ /app/
# 配置 Conda 鏡像為清華大學源
RUN conda config --set show_channel_urls yes \
&& conda config --remove channels defaults || true \
&& conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main \
&& conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r \
&& conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 \
&& conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge \
&& conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
# 配置 pip 鏡像為清華大學源
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
# 賦予入口腳本可執行權限
RUN chmod +x /app/entrypoint.sh
# 暴露端口 23001
EXPOSE 23001
# 創建 Conda 環境并安裝依賴
RUN conda env create -f /app/environment.yml
# 使用入口腳本作為容器的默認命令
ENTRYPOINT ["/app/entrypoint.sh"]
其中 /app/environment.yml 是 conda 中要安裝的依賴文件版本
示例如下
name: alg_xxx_env
channels:
- pytorch
- defaults
- conda-forge
dependencies:
- _libgcc_mutex=0.1=main
- _openmp_mutex=5.1=1_gnu
- _tflow_select=2.1.0=gpu
- absl-py=0.15.0=pyhd3eb1b0_0
- astor=0.8.1=py37h06a4308_0
- blas=1.0=mkl
- c-ares=1.19.1=h5eee18b_0
- ca-certificates=2023.01.10=h06a4308_0
- certifi=2022.12.7=py37h06a4308_0
- cudatoolkit=10.2.89=hfd86e86_1
- cudnn=7.6.5=cuda10.2_0
- fftw=3.3.9=h5eee18b_2
- flit-core=3.6.0=pyhd3eb1b0_0
- gast=0.2.2=py37_0
- google-pasta=0.2.0=pyhd3eb1b0_0
- grpcio=1.42.0=py37hce63b2e_0
- hdf5=1.10.6=h3ffc7dd_1
- importlib-metadata=4.11.3=py37h06a4308_0
- intel-openmp=2021.4.0=h06a4308_3561
- itsdangerous=2.0.1=pyhd3eb1b0_0
- keras-applications=1.0.8=py_1
- keras-preprocessing=1.1.2=pyhd3eb1b0_0
- ld_impl_linux-64=2.38=h1181459_1
- libffi=3.3=he6710b0_2
- libgcc-ng=11.2.0=h1234567_1
- libgfortran-ng=11.2.0=h00389a5_1
- libgfortran5=11.2.0=h1234567_1
- libgomp=11.2.0=h1234567_1
- libprotobuf=3.20.3=he621ea3_0
- libstdcxx-ng=11.2.0=h1234567_1
- libuv=1.48.0=h5eee18b_0
- markdown=3.4.1=py37h06a4308_0
- mkl=2021.4.0=h06a4308_640
- mkl-service=2.4.0=py37h7f8727e_0
- mkl_fft=1.3.1=py37hd3c417c_0
- mkl_random=1.2.2=py37h51133e4_0
- ncurses=6.4=h6a678d5_0
- openssl=1.1.1t=h7f8727e_0
- opt_einsum=3.3.0=pyhd3eb1b0_1
- pip=22.1.2=py37h06a4308_0
- protobuf=3.20.3=py37h6a678d5_0
- python=3.7.13=h12debd9_0
- pytorch=1.11.0=py3.7_cpu_0
- pytorch-mutex=1.0=cpu
- readline=8.2=h5eee18b_0
- scipy=1.7.3=py37h6c91a56_2
- setuptools=61.2.0=py37h06a4308_0
- six=1.16.0=pyhd3eb1b0_1
- sqlite=3.38.5=hc218d9a_0
- termcolor=1.1.0=py37h06a4308_1
- tk=8.6.14=h39e8969_0
- wheel=0.37.1=pyhd3eb1b0_0
- wrapt=1.14.1=py37h5eee18b_0
- xz=5.4.6=h5eee18b_1
- zipp=3.11.0=py37h06a4308_0
- zlib=1.2.13=h5eee18b_1
- pip:
- aiohttp==3.8.4
- aiosignal==1.3.1
- antlr4-python3-runtime==4.9.3
- async-timeout==4.0.2
- asynctest==0.13.0
- attrs==23.1.0
- charset-normalizer==2.1.0
- click==8.1.7
- colorama==0.4.5
- cycler==0.11.0
- et-xmlfile==1.1.0
- fitter==1.5.2
- flask==2.2.5
- fonttools==4.34.4
- frozenlist==1.3.3
- fsspec==2023.1.0
- glog==0.3.1
- h5py==3.8.0
- idna==3.3
- imageio==2.26.0
- imbalanced-learn==0.10.1
- imblearn==0.0
- jinja2==3.1.2
- joblib==1.2.0
- kiwisolver==1.4.4
- lightning-utilities==0.10.1
- markupsafe==2.1.2
- matplotlib==3.5.2
- multidict==6.0.4
- numpy==1.21.6
- omegaconf==2.3.0
- openpyxl==3.0.10
- packaging==21.3
- pandas==1.3.5
- pillow==9.2.0
- psutil==5.9.4
- pydotplus==2.0.2
- pyparsing==3.0.9
- python-dateutil==2.8.2
- python-gflags==3.1.2
- pytorch-lightning==1.9.5
- pytz==2022.1
- pyyaml==6.0
- requests==2.28.1
- scikit-learn==1.0.2
- seaborn==0.12.2
- threadpoolctl==3.1.0
- torchmetrics==0.11.4
- tqdm==4.64.0
- typing-extensions==4.3.0
- urllib3==1.26.10
- werkzeug==2.2.3
- xlrd==2.0.1
- xlwt==1.3.0
- yarl==1.9.2
prefix: /opt/conda/envs/alg_ncepu_env
其中 entrypoint.sh 是入口腳本
#!/bin/bash
# 確保腳本在遇到錯誤時退出
set -e
# 初始化 Conda
echo "Initializing Conda..."
eval "$(/opt/conda/bin/conda shell.bash hook)"
# 激活 Conda 環境
echo "Activating Conda environment: alg_xxx_env"
conda activate alg_xxx_env
# 運行 Python 腳本并確保它們在后臺運行
echo "Starting the Python scripts..."
cd /app/
# 使用 & 將所有 Python 腳本放入后臺
python xxx.py &
# 等待所有后臺進程完成
wait
echo "All scripts have completed."
示例 4
FROM golang:1.23-bookworm
ENV GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
# 設置工作目錄
WORKDIR /app
# 復制源代碼和相關文件
COPY . .
# 構建 Go 應用
RUN go build -o myapp .
# 暴露應用端口
EXPOSE 5005
# 運行應用
CMD ["./myapp"]
運行
docker build -t xxx:1.0 .
docker run -d \
--name xxx \
-p 25005:5005 \
-e TZ='Asia/Shanghai' \
xxx:1.0
docker exec -it xxx /bin/bash
OpenJDK 基礎鏡像
Eclipse Temurin
https://adoptium.net/zh-CN/temurin/releases/
https://hub.docker.com/_/eclipse-temurin
Eclipse Temurin 是由 Eclipse Adoptium 項目提供的 高質量、開源、兼容 OpenJDK 的 Java 運行時環境(JRE)和開發工具包(JDK) 的發行版本。
特點:
- 開源、免費:基于 OpenJDK,完全開源,沒有許可證費用。
- 多平臺支持:支持 Linux、Windows、macOS、AIX 等主流平臺。
- 版本豐富:支持多個 Java 版本,如 Java 8、11、17、21 等 LTS 版本。
- 質量保障:每個構建都經過 Adoptium 的 AQAvit(質量驗證測試)。
- 與 OpenJDK 完全兼容:可放心替代 Oracle JDK。
Ubuntu 基礎鏡像
docker pull eclipse-temurin:21
docker pull eclipse-temurin:21-jre-noble
docker pull eclipse-temurin:21-jre-jammy
docker pull eclipse-temurin:17-jre-noble
docker pull eclipse-temurin:17-jre-jammy
docker pull eclipse-temurin:17-jre-focal
docker pull eclipse-temurin:8-jre-noble
docker pull eclipse-temurin:8-jre-jammy
docker pull eclipse-temurin:8-jre-focal
docker pull eclipse-temurin:8u452-b09-jre-noble
CentOS 基礎鏡像
docker pull eclipse-temurin:17-jre-centos7
docker pull eclipse-temurin:8-jre-centos7
Alpine 基礎鏡像
docker pull eclipse-temurin:21-jre-alpine
docker pull eclipse-temurin:17-jre-alpine
docker pull eclipse-temurin:8-jre-alpine
UBI 鏡像
docker pull eclipse-temurin:8u442-b06-jdk-ubi9-minimal
docker pull eclipse-temurin:8u442-b06-jre-ubi9-minimal
docker pull eclipse-temurin:8-jre-ubi9-minimal
docker pull eclipse-temurin:8-jdk-ubi9-minimal
Amazon Corretto
Amazon Corretto 是開放 Java 開發工具包 (OpenJDK) 的免費、多平臺、生產就緒型發行版。
Corretto 提供長期支持,其中包括性能增強和安全修復。
亞馬遜在內部的數千種生產服務上運行 Corretto,并且 Corretto 已被證明能夠兼容 Java SE 標準。
借助 Corretto,您可以在常用操作系統(包括 Linux、Windows 和 macOS)上開發和運行 Java 應用程序。
https://hub.docker.com/_/amazoncorretto
https://github.com/corretto/corretto-docker
docker pull amazoncorretto:8-alpine-jre
docker pull amazoncorretto:8
docker pull amazoncorretto:17
docker pull amazoncorretto:17-alpine
docker pull amazoncorretto:21
docker pull amazoncorretto:21-alpine
Azul Zulu
下載 Windows JDK8
https://www.azul.com/downloads/?package=jdk#zulu
- Ubuntu: azul/zulu-openjdk
- Alpine: azul/zulu-openjdk-alpine
- CentOS: azul/zulu-openjdk-centos
- Debian: azul/zulu-openjdk-debian
- Distroless: azul/zulu-openjdk-distroless
Ubuntu 基礎鏡像
docker pull azul/zulu-openjdk:21-jre-headless
docker pull azul/zulu-openjdk:17-jre-headless
docker pull azul/zulu-openjdk:8-jre-headless
這些 Azul Zulu Build of OpenJDK 的 Docker 鏡像基于 Ubuntu,有不同的版本和特性,主要區別如下:
- 21-jre-headless-latest, 21.0.0-21.28.85-jre-headless, 21.0.1-21.30-jre-headless:
-
- JRE (Java Runtime Environment) 版本。
- Headless:沒有圖形用戶界面 (GUI) 支持,適合服務器或沒有圖形環境的場景。
- 21-jdk-crac-latest, 21-jre-crac-latest:
-
- JDK (Java Development Kit) 版本,包含開發工具(如編譯器)。
- CRaC (Checkpoints and Restoration at Checkpoint):支持檢查點和恢復功能,用于提升應用程序的恢復速度。
- 21-jre-latest, 21.0.0-21.28.85-jre, 21.0.1-21.30-jre:
-
- JRE 版本,適合運行 Java 應用程序。
- 版本號的不同表示 Java 的版本更新。
- 21-latest, 21.0.0-21.28.85, 21.0.1-21.30, 21.0.1-21.30.15:
-
- 包含 JRE 和 JDK 版本。
- Latest 表示最新穩定版本,其他版本號表示具體的發行版本或更新版本。
總的來說,headless 版本適用于沒有 GUI 的環境,CRaC 版本支持檢查點和恢復,latest 表示最新版本,其他具體的版本號提供更詳細的版本信息。
Debian 基礎鏡像
docker pull azul/zulu-openjdk-debian:21-jre-headless
docker pull azul/zulu-openjdk-debian:17-jre-headless
docker pull azul/zulu-openjdk-debian:8-jre-headless
CentOS 基礎鏡像
docker pull azul/zulu-openjdk-centos:8-jre-headless
docker pull azul/zulu-openjdk-centos:8u442-jre
docker pull azul/zulu-openjdk-centos:8u442-jdk
Alpine 基礎鏡像
docker pull azul/zulu-openjdk-alpine:21-jre-headless
docker pull azul/zulu-openjdk-alpine:17-jre-headless
docker pull azul/zulu-openjdk-alpine:8-jre-headless
BellSoft Liberica JDK
https://bell-sw.com/pages/downloads/
https://bell-sw.com/pages/libericajdk/
適用于現代 Java? 部署的免費和 100% 開源漸進式 Java 運行時,由領先的 OpenJDK 貢獻者支持
https://hub.docker.com/r/bellsoft/liberica-openjdk-debian
https://hub.docker.com/r/bellsoft/liberica-openjre-debian
docker pull bellsoft/liberica-openjre-debian:8
docker pull bellsoft/liberica-openjre-debian:21
在 Liberica JDK 容器鏡像的上下文中,CDS 代表 Class Data Sharing(類數據共享)。
CDS 是 Java 虛擬機(JVM)的一項優化技術,旨在 減少 Java 應用程序的啟動時間 和 降低內存占用。它通過在多個 JVM 實例之間共享預編譯的類元數據來提高運行效率。
在 Liberica JDK Rocky Linux 的容器鏡像中,帶有 CDS 標記的鏡像 預打包了 CDS 存檔,這意味著它已經包含了經過優化的類數據,能夠加快 Java 應用程序的啟動速度,特別適用于云環境和容器化部署。
CDS 的優點:
- 更快的啟動時間:避免了 JVM 在每次啟動時都重新解析和加載類數據。
- 降低內存使用:多個 JVM 進程可以共享相同的類元數據,減少內存占用。
- 提高應用性能:減少了類加載的開銷,優化了執行效率。
如果你需要使用帶有 CDS 優化的 Liberica JDK 容器鏡像,你可以選擇 帶有 cds 標記的版本,例如:
FROM bellsoft/liberica-openjdk-rocky:21-cds
這樣,你的應用程序就可以利用 CDS 技術來提升運行效率。
https://bell-sw.com/blog/bellsoft-releases-container-images-with-liberica-jdk-for-rocky-linux/
我們很高興地宣布發布適用于 Rocky Linux 的 Liberica JDK 容器鏡像!這些鏡像旨在替代 CentOS 的 Liberica JDK 鏡像。由于 CentOS Stream 8 將于 2024 年 5 月 31 日停止服務,我們決定為開發人員提供一組基于積極開發和社區支持的 Linux 發行版的 Java 應用程序 OCI 容器鏡像。
Rocky Linux是一款流行的發行版,旨在與 Red Hat Enterprise Linux (RHEL) 100% 兼容。Rocky Linux 直接從 RHEL 重建源代碼;構建版本已準備好用于企業。發布時間表與 RHEL 的時間表一致,每年 5 月發布新的主要版本,每年 5 月和 11 月發布次要版本。
請注意,隨著 Rocky Linux 的 Liberica JDK 鏡像的推出,BellSoft 的 CentOS 鏡像已被視為棄用。但如果您一直在使用 CentOS 基礎鏡像,則可以順利遷移到 Rocky。
有兩個包含 Rocky Linux JVM 映像的存儲庫:Liberica JDK和Liberica JRE。兩個存儲庫都包含適用于 x86_64 和 Aarch64 架構的 LTS JDK 版本(8、11、17、21)和最新非 LTS 版本(當前為 23)的映像。此外,還有帶有預打包 CDS 存檔的映像,旨在減少 Java 應用程序的啟動。
圖像名稱具有以下結構:X-Y,其中X是 Java 版本,Y是體系結構類型。具有 CDS 存檔的圖像還帶有 標記cds。如果未指定體系結構,則默認使用 x86_64 的圖像。
例如,要使用 Liberica JDK 21 為 x86_64 上的 Rocky Linux 構建應用程序,請在 Dockerfile 中使用以下 FROM 指令:
FROM bellsoft/liberica-openjdk-rocky:21
IBM Semeru
https://hub.docker.com/_/ibm-semeru-runtimes
docker pull ibm-semeru-runtimes:open-8-jre-jammy
docker pull ibm-semeru-runtimes:open-8-jre-focal
docker pull ibm-semeru-runtimes:open-17-jre-focal
docker pull ibm-semeru-runtimes:open-17-jre-jammy
docker pull ibm-semeru-runtimes:open-21-jre-focal
docker pull ibm-semeru-runtimes:open-21-jre-jammy
Microsoft Build of OpenJDK
https://www.microsoft.com/openjdk
Free. Open Source. Freshly Brewed!
Microsoft Build of OpenJDK 是 OpenJDK 的一種免費分發版,它是開放源代碼,任何人都可將其免費部署到任意位置。
它包括適用于 macOS、Linux 和 Windows 上 x64 服務器和桌面環境中的 Java 11 和 Java 17 的長期支持 (LTS) 二進制文件、適用于 Linux 和 Windows 上的 AArch64/ARM64 的長期支持二進制文件、適用于 Apple Silicon (AArch64/M1) 上 macOS 的二進制文件,以及適用于 x64 上 Alpine Linux 的 musl libc 編譯二進制文件。
Microsoft Build of OpenJDK 二進制文件基于 OpenJDK 源代碼,遵循 Eclipse Adoptium 項目使用的相同生成腳本,并根據 Eclipse Adoptium 質量保證套件(包括 OpenJDK 項目測試)進行了測試。
我們正式發布的二進制文件已通過 Java 技術兼容性工具包 (TCK) 的測試,該工具包用于驗證與 Java 規范的兼容性。
Microsoft Build of OpenJDK 是 Java 生態系統中可用的任何其他 OpenJDK 分發版的普適性替代產品。
Microsoft Build of OpenJDK 二進制文件可能包含我們認為對客戶和內部用戶很重要的向后移植修補程序和增強功能。
其中一些可能尚未在上游正式向后移植,已在發行說明中明確標出。
這使我們能夠加快改進和修復,同時繼續并行實現這些更改的上游化。
更新是免費的,可供每個 Java 開發人員在任意位置部署。
https://hub.docker.com/r/microsoft/openjdk-jdk
docker pull mcr.microsoft.com/openjdk/jdk:21-ubuntu
SapMachine
https://hub.docker.com/_/sapmachine
docker pull sapmachine:21-jre-ubuntu-jammy
docker pull sapmachine:21-jre-ubuntu-focal
docker pull sapmachine:17-jre-ubuntu-jammy
docker pull sapmachine:17-jre-ubuntu-focal
阿里巴巴龍井
https://github.com/alibaba/dragonwell8
騰訊 Kona
https://cloud.tencent.com/product/tkjdk
https://github.com/Tencent/TencentKona-8
https://github.com/Tencent/TencentKona-17
畢昇JDK
https://www.openeuler.org/zh/other/projects/bishengjdk/
ARM 上最好用的 JDK
下載

浙公網安備 33010602011771號