基于 xiaoyawl/docker-jdk 的单 Dockerfile 思路重做为多系统、多架构、多 JDK 版本镜像工程。默认支持 benyoo/centos:9-stream-20260615、benyoo/rockylinux:9-20260615 和 benyoo/alpine:3.24.20260615,后续增加 Ubuntu 只需要在 docker-bake.hcl 追加一个 target。
构建时只安装 Oracle JDK。脚本会优先尝试 Oracle 官方下载地址;如果官方下载失败、需要登录、或返回内容不是有效的 tar.gz,会自动探测 https://mirrors.dtops.co/Java/Java%20SE%20<version>/ 作为 Oracle JDK 保底源,兼容“直接放文件”和“按版本号子目录放文件”两种结构。
| 下载阶段 | 来源 | 实际 JDK 发行版 | 版本策略 |
|---|---|---|---|
| Primary | Oracle 官方下载地址 | Oracle JDK | 优先使用 Oracle 官方可直下的最新包或归档页解析到的最新包 |
| Fallback | mirrors.dtops.co | Oracle JDK | 只在 Primary 下载失败、需要登录、或返回无效 tar.gz 时使用,版本以镜像站现有文件为准 |
注意:镜像只接受 Oracle JDK,不安装其他 JDK 发行版。Primary 和 Fallback 的来源不同,所以完整版本号、补丁版本、许可证文本和 java -version 输出仍可能不同,但 JDK 发行版必须都是 Oracle JDK。
| 能力 | amd64 | arm64 | 说明 |
|---|---|---|---|
| JDK 8 | yes | yes | Oracle JDK only,官方失败后镜像站保底 |
| JDK 11 | yes | yes | Oracle JDK only,官方失败后镜像站保底 |
| JDK 17 | yes | yes | Oracle JDK only,官方失败后镜像站保底 |
| JDK 21 | yes | yes | Oracle JDK only,官方失败后镜像站保底 |
| JDK 25 | yes | yes | Oracle JDK only,官方失败后镜像站保底 |
| CentOS Stream 9 | yes | yes | benyoo/centos:9-stream-20260615 |
| Rocky Linux 9 | yes | yes | benyoo/rockylinux:9-20260615 |
| Alpine 3.24 | yes | yes | benyoo/alpine:3.24.20260615 |
| Tag | 基础镜像 | Java |
|---|---|---|
benyoo/jdk:<java>-centos9-stream | benyoo/centos:9-stream-20260615 | 8 / 11 / 17 / 21 / 25 |
benyoo/jdk:<full-java>-centos9-stream | benyoo/centos:9-stream-20260615 | 8u491 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3 |
benyoo/jdk:<java>-rockylinux9 | benyoo/rockylinux:9-20260615 | 8 / 11 / 17 / 21 / 25 |
benyoo/jdk:<full-java>-rockylinux9 | benyoo/rockylinux:9-20260615 | 8u491 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3 |
benyoo/jdk:<java>-alpine3.24 | benyoo/alpine:3.24.20260615 | 8 / 11 / 17 / 21 / 25 |
benyoo/jdk:<full-java>-alpine3.24 | benyoo/alpine:3.24.20260615 | 8u491 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3 |
benyoo/jdk:<java>-centos9-stream-20260615 | benyoo/centos:9-stream-20260615 | 8 / 11 / 17 / 21 / 25 |
benyoo/jdk:<full-java>-centos9-stream-20260615 | benyoo/centos:9-stream-20260615 | 8u491 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3 |
benyoo/jdk:<java>-rockylinux9-20260615 | benyoo/rockylinux:9-20260615 | 8 / 11 / 17 / 21 / 25 |
benyoo/jdk:<full-java>-rockylinux9-20260615 | benyoo/rockylinux:9-20260615 | 8u491 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3 |
benyoo/jdk:<java>-alpine3.24-20260615 | benyoo/alpine:3.24.20260615 | 8 / 11 / 17 / 21 / 25 |
benyoo/jdk:<full-java>-alpine3.24-20260615 | benyoo/alpine:3.24.20260615 | 8u491 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3 |
默认多架构构建目标是 linux/amd64,linux/arm64。
IMAGE="benyoo/jdk"
./scripts/generate-bake.sh docker-bake.generated.hcl
docker buildx bake -f docker-bake.generated.hcl --print
docker buildx bake -f docker-bake.generated.hcl
只构建一个版本:
IMAGE="benyoo/jdk"
JAVA_VERSION="21"
BASE_IMAGE="benyoo/rockylinux:9-20260615"
docker buildx build \
--platform linux/amd64,linux/arm64 \
--build-arg BASE_IMAGE="${BASE_IMAGE}" \
--build-arg JAVA_VERSION="${JAVA_VERSION}" \
-t "${IMAGE}:${JAVA_VERSION}-rockylinux9" \
.
推送到 DockerHub:
IMAGE="benyoo/jdk"
./scripts/generate-bake.sh docker-bake.generated.hcl
docker buildx bake -f docker-bake.generated.hcl --push
不下载大包,只检查主下载地址和镜像站保底地址:
JAVA_VERSION="21" TARGETARCH="amd64" ./scripts/install-jdk.sh --print-primary-url
JAVA_VERSION="21" TARGETARCH="amd64" ./scripts/install-jdk.sh --print-mirror-url
JAVA_VERSION="21" TARGETARCH="arm64" ./scripts/install-jdk.sh --print-mirror-url
JAVA_VERSION="21" TARGETARCH="amd64" ./scripts/install-jdk.sh --print-full-version
镜像默认把 Oracle JDK 加入 PATH,可以直接运行 java、javac 或进入 shell:
docker run --rm benyoo/jdk:21-rockylinux9 java -version
docker run --rm benyoo/jdk:21-rockylinux9 javac -version
docker run -it --rm benyoo/jdk:21-rockylinux9 bash
作为业务基础镜像:
FROM benyoo/jdk:21-rockylinux9
WORKDIR /app
COPY target/app.jar /app/app.jar
ENV JAVA_TOOL_OPTIONS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75" \
APP_JAR="/app/app.jar"
CMD []
运行业务 Jar:
docker run -d \
--name java-app \
--restart always \
-p 8080:8080 \
-e TIMEZONE="Asia/Shanghai" \
-e JAVA_TOOL_OPTIONS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75" \
-e JAVA_OPTS="-Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai" \
-e APP_JAR="/app/app.jar" \
-e APP_ARGS="--spring.config.additional-location=/config/" \
-e LOG_CLEANUP_CRON="0 3 * * *" \
-e LOG_CLEANUP_DIRS="/logs" \
-e LOG_CLEANUP_RETENTION_DAYS="30" \
-v "$PWD/app:/app" \
-v "$PWD/config:/config:ro" \
-v "$PWD/data:/data" \
-v "$PWD/logs:/logs" \
benyoo/jdk:21-rockylinux9
| 接入口 | 用途 |
|---|---|
TIMEZONE | 推荐使用的时区入口;entrypoint 会自动导出为 TZ 以兼容 Linux/JVM 常规读取方式 |
TZ | 标准 Linux 时区变量;仅在兼容第三方镜像或已有部署时需要显式设置 |
JAVA_TOOL_OPTIONS | JVM 标准参数入口,推荐放容器内存、GC、编码等参数 |
JAVA_OPTS | entrypoint 传给 java 的简单参数 |
JAVA_ARG_FILTER_ENABLED | Java 参数兼容过滤开关,默认 true;会按 JDK 大版本过滤明显不兼容的模块/native-access 参数 |
APP_JAR | 指定 /app/app.jar 这类业务 Jar |
APP_ARGS | 传给业务 Jar 的简单启动参数 |
APP_MAIN_CLASS | 使用 classpath + main class 启动 |
APP_CLASSPATH | 默认 /app/classes:/app/libs/* |
APP_START_SCRIPT | 指定自定义启动脚本,例如 /app/start.sh |
LOG_CLEANUP_CRON | 日志清理计划任务,例如 0 3 * * *;支持多行或用 ; 分隔多个计划 |
CRON_TASKS | 自定义 root crontab 任务,支持多行,例如 */10 * * * * /app/scripts/check.sh |
CUSTOM_CRON_TASKS | CRON_TASKS 的兼容别名 |
LOG_CLEANUP_DIRS | 要清理的日志目录,多个目录用空格分隔,默认 /logs |
LOG_CLEANUP_RETENTION_DAYS | 删除超过多少天的历史日志,默认 30 |
LOG_CLEANUP_PATTERNS | 清理文件名匹配,默认 *.20??-??-??.log *.log.* *.log-*.gz *.out.* *.err.* *.gz |
LOG_CLEANUP_MAX_DEPTH | 查找目录深度,默认 1 |
LOG_CLEANUP_DRY_RUN | true 时只打印将删除的文件,不实际删除 |
/config | 配置挂载目录 |
/data | 业务数据挂载目录 |
/logs | 日志挂载目录 |
镜像内置的是“历史日志清理”,不强行切割业务正在写入的当前日志文件。日志切割建议继续交给业务框架的 logback/log4j2;镜像负责按保留天数清理已经滚动出来的历史文件。
environment:
LOG_CLEANUP_CRON: "0 3 * * *"
LOG_CLEANUP_DIRS: "/data/payment/logs"
LOG_CLEANUP_RETENTION_DAYS: "30"
多个日志清理计划可以用多行或分号:
environment:
LOG_CLEANUP_CRON: |
0 3 * * *
30 15 * * 0
LOG_CLEANUP_DIRS: "/data/payment/logs"
LOG_CLEANUP_RETENTION_DAYS: "30"
自定义计划任务使用标准 root crontab 语法:
environment:
CRON_TASKS: |
*/10 * * * * /app/scripts/check.sh >> /logs/check.log 2>&1
0 4 * * * find /tmp -type f -mtime +3 -delete
如果要先观察会删除哪些文件:
environment:
LOG_CLEANUP_CRON: "0 3 * * *"
LOG_CLEANUP_DIRS: "/data/payment/logs"
LOG_CLEANUP_RETENTION_DAYS: "30"
LOG_CLEANUP_DRY_RUN: "true"
如果业务日志出现类似下面的错误:
java.lang.UnsupportedClassVersionError: ... has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0
这表示业务 Jar 是用更高版本 Java 编译的,当前运行时 JDK 太低。class file version 61.0 对应 Java 17,52.0 对应 Java 8,所以这类 Jar 不能用 JDK 8 镜像运行,需要切换到 JDK 17、21 或 25 镜像。
示例:
services:
payment:
image: benyoo/jdk:17.0.19-rockylinux9-20260615
docker compose up -d
docker compose logs -f java-app
docker compose --profile debug run --rm java-shell
sudo。javac、jcmd、jmap、include 或 src.zip。gcompat、libc6-compat、libstdc++ 并设置 JDK 动态库路径。mirrors.dtops.co 是失败兜底源,包来源按镜像站文件为准,当前解析逻辑按 Oracle JDK Linux tarball 文件名匹配。Content type
Image
Digest
sha256:0314a7d83…
Size
283.2 MB
Last updated
3 months ago
docker pull benyoo/jdk:21.0.11-centos9-stream-20260615