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 中的指令,用于声明容器内应用程序计划监听的网络端口。它主要起到文档化提示作用,具体如下:

  1. 声明端口

    • EXPOSE 告知 Docker 和用户,容器内的应用程序将在指定的端口上运行或接受连接。
    • 语法:EXPOSE <port> [<port>/<protocol>],例如 EXPOSE 80EXPOSE 53/UDP
    • 默认协议为 TCP,可指定 UDP
  2. 不影响程序运行

    • EXPOSE 仅声明端口,不会改变容器内应用程序的实际行为。
    • 如果应用程序未在声明的端口上监听,EXPOSE 本身不会强制监听。
    • 未声明端口,应用程序仍可正常监听其他端口,但用户需自行查看程序配置或代码以了解实际使用的端口
  3. 文档化作用

    • 声明端口使镜像使用更透明,方便其他开发者或运维人员了解容器预期的工作方式。
    • 例如,Web 应用通常声明 80443 端口,数据库可能声明 3306(MySQL)或 5432(PostgreSQL)。
  4. 不自动开放端口

    • 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) 的发行版本。

特点:

  1. 开源、免费:基于 OpenJDK,完全开源,没有许可证费用。
  2. 多平台支持:支持 Linux、Windows、macOS、AIX 等主流平台。
  3. 版本丰富:支持多个 Java 版本,如 Java 8、11、17、21 等 LTS 版本。
  4. 质量保障:每个构建都经过 Adoptium 的 AQAvit(质量验证测试)。
  5. 与 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 基础镜像

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,有不同的版本和特性,主要区别如下:

  1. 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) 支持,适合服务器或没有图形环境的场景。
  1. 21-jdk-crac-latest, 21-jre-crac-latest
    • JDK (Java Development Kit) 版本,包含开发工具(如编译器)。
    • CRaC (Checkpoints and Restoration at Checkpoint):支持检查点和恢复功能,用于提升应用程序的恢复速度。
  1. 21-jre-latest, 21.0.0-21.28.85-jre, 21.0.1-21.30-jre
    • JRE 版本,适合运行 Java 应用程序。
    • 版本号的不同表示 Java 的版本更新。
  1. 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 的优点:

  1. 更快的启动时间:避免了 JVM 在每次启动时都重新解析和加载类数据。
  2. 降低内存使用:多个 JVM 进程可以共享相同的类元数据,减少内存占用。
  3. 提高应用性能:减少了类加载的开销,优化了执行效率。

如果你需要使用带有 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 JDKLiberica 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

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://dragonwell-jdk.io/

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

下载

https://www.hikunpeng.com/developer/devkit/download/jdk

posted @ 2025-06-15 11:53  ioufev  阅读(82)  评论(0)    收藏  举报