Sign inSign up

benyoo/jdk

By benyoo

•Updated 3 months ago

Java SE Development Kit Docker

Image
0

5.9K

benyoo/jdk repository overview

⁠DSTW Docker JDK

Docker Arch Java

⁠Overview

基于 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 Source Policy

下载阶段来源实际 JDK 发行版版本策略
PrimaryOracle 官方下载地址Oracle JDK优先使用 Oracle 官方可直下的最新包或归档页解析到的最新包
Fallbackmirrors.dtops.coOracle JDK只在 Primary 下载失败、需要登录、或返回无效 tar.gz 时使用,版本以镜像站现有文件为准

注意:镜像只接受 Oracle JDK,不安装其他 JDK 发行版。Primary 和 Fallback 的来源不同,所以完整版本号、补丁版本、许可证文本和 java -version 输出仍可能不同,但 JDK 发行版必须都是 Oracle JDK。

⁠Capability Matrix

能力amd64arm64说明
JDK 8yesyesOracle JDK only,官方失败后镜像站保底
JDK 11yesyesOracle JDK only,官方失败后镜像站保底
JDK 17yesyesOracle JDK only,官方失败后镜像站保底
JDK 21yesyesOracle JDK only,官方失败后镜像站保底
JDK 25yesyesOracle JDK only,官方失败后镜像站保底
CentOS Stream 9yesyesbenyoo/centos:9-stream-20260615
Rocky Linux 9yesyesbenyoo/rockylinux:9-20260615
Alpine 3.24yesyesbenyoo/alpine:3.24.20260615

⁠Tags

Tag基础镜像Java
benyoo/jdk:<java>-centos9-streambenyoo/centos:9-stream-202606158 / 11 / 17 / 21 / 25
benyoo/jdk:<full-java>-centos9-streambenyoo/centos:9-stream-202606158u491 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3
benyoo/jdk:<java>-rockylinux9benyoo/rockylinux:9-202606158 / 11 / 17 / 21 / 25
benyoo/jdk:<full-java>-rockylinux9benyoo/rockylinux:9-202606158u491 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3
benyoo/jdk:<java>-alpine3.24benyoo/alpine:3.24.202606158 / 11 / 17 / 21 / 25
benyoo/jdk:<full-java>-alpine3.24benyoo/alpine:3.24.202606158u491 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3
benyoo/jdk:<java>-centos9-stream-20260615benyoo/centos:9-stream-202606158 / 11 / 17 / 21 / 25
benyoo/jdk:<full-java>-centos9-stream-20260615benyoo/centos:9-stream-202606158u491 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3
benyoo/jdk:<java>-rockylinux9-20260615benyoo/rockylinux:9-202606158 / 11 / 17 / 21 / 25
benyoo/jdk:<full-java>-rockylinux9-20260615benyoo/rockylinux:9-202606158u491 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3
benyoo/jdk:<java>-alpine3.24-20260615benyoo/alpine:3.24.202606158 / 11 / 17 / 21 / 25
benyoo/jdk:<full-java>-alpine3.24-20260615benyoo/alpine:3.24.202606158u491 / 11.0.31 / 17.0.19 / 21.0.11 / 25.0.3

⁠Build

默认多架构构建目标是 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

⁠Verify Download Resolver

不下载大包,只检查主下载地址和镜像站保底地址:

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

⁠Usage

镜像默认把 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

⁠Runtime Entrypoints

接入口用途
TIMEZONE推荐使用的时区入口;entrypoint 会自动导出为 TZ 以兼容 Linux/JVM 常规读取方式
TZ标准 Linux 时区变量;仅在兼容第三方镜像或已有部署时需要显式设置
JAVA_TOOL_OPTIONSJVM 标准参数入口,推荐放容器内存、GC、编码等参数
JAVA_OPTSentrypoint 传给 java 的简单参数
JAVA_ARG_FILTER_ENABLEDJava 参数兼容过滤开关,默认 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_TASKSCRON_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_RUNtrue 时只打印将删除的文件,不实际删除
/config配置挂载目录
/data业务数据挂载目录
/logs日志挂载目录

⁠Log Cleanup

镜像内置的是“历史日志清理”,不强行切割业务正在写入的当前日志文件。日志切割建议继续交给业务框架的 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"

⁠Troubleshooting

⁠UnsupportedClassVersionError

如果业务日志出现类似下面的错误:

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

docker compose up -d
docker compose logs -f java-app
docker compose --profile debug run --rm java-shell

⁠Notes

  • 文档命令默认在 root 环境执行,不加 sudo。
  • 构建时默认保留完整 JDK,不删除 javac、jcmd、jmap、include 或 src.zip。
  • Alpine 镜像使用 Oracle JDK 的 glibc 二进制包,镜像内会安装 gcompat、libc6-compat、libstdc++ 并设置 JDK 动态库路径。
  • mirrors.dtops.co 是失败兜底源,包来源按镜像站文件为准,当前解析逻辑按 Oracle JDK Linux tarball 文件名匹配。
  • 如果多架构中某个 JDK 上游或镜像站缺少 arm64 包,构建会失败,不会静默降级为 amd64。

Tag summary

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