一、使用Dockerfile构建镜像

# 使用 Ubuntu 24.04 LTS (Noble) 作为基础镜像
FROM ubuntu:24.04

# 避免安装时出现交互界面
ENV DEBIAN_FRONTEND=noninteractive

# 安装必要的证书、p11-kit 和 tzdata,配置时区(默认 Asia/Shanghai)
ARG TZ=Asia/Shanghai
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates \
p11-kit \
tzdata && \
# 配置系统时区
ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime && \
echo "${TZ}" > /etc/timezone && \
dpkg-reconfigure --frontend noninteractive tzdata && \
rm -rf /var/lib/apt/lists/*

# 设置 Java 环境变量(与官方 openjdk 镜像保持一致)
ENV JAVA_HOME=/usr/local/openjdk-21
ENV PATH=$JAVA_HOME/bin:$PATH
ENV LANG=C.UTF-8
# 可选,使 JVM 优先读取该环境变量
ENV TZ=${TZ}
# 通过 JAVA_TOOL_OPTIONS 自动设置默认 JVM 内存参数(可被运行时覆盖)
ENV JAVA_TOOL_OPTIONS="-Xmx1024M -Xms256M"

# 复制本地的 JDK 压缩包(确保文件名与你的文件一致)
COPY jdk-21_linux-x64_bin.tar.gz /tmp/openjdk.tgz

# 解压并配置 JDK,参考官方 openjdk 镜像的优化步骤
RUN set -eux; \
mkdir -p "$JAVA_HOME"; \
tar --extract \
--file /tmp/openjdk.tgz \
--directory "$JAVA_HOME" \
--strip-components 1 \
--no-same-owner; \
rm /tmp/openjdk.tgz; \
# 删除运行时不需要的文件(可大幅减小镜像体积)
rm -f "$JAVA_HOME/lib/src.zip"; \
rm -rf "$JAVA_HOME/demo" "$JAVA_HOME/sample" "$JAVA_HOME/man"; \
# 更新 Java 证书(使用系统 CA 证书)
{ \
echo '#!/usr/bin/env bash'; \
echo 'set -Eeuo pipefail'; \
echo 'trust extract --overwrite --format=java-cacerts --filter=ca-anchors --purpose=server-auth "$JAVA_HOME/lib/security/cacerts"'; \
} > /etc/ca-certificates/update.d/docker-openjdk; \
chmod +x /etc/ca-certificates/update.d/docker-openjdk; \
/etc/ca-certificates/update.d/docker-openjdk; \
# 配置动态链接库缓存
find "$JAVA_HOME/lib" -name '*.so' -exec dirname '{}' ';' | sort -u > /etc/ld.so.conf.d/docker-openjdk.conf; \
ldconfig; \
# 预编译共享类数据(提升启动速度)并验证安装
java -Xshare:dump; \
javac --version; \
java --version

# 设置工作目录,便于挂载 JAR 文件
WORKDIR /app

# 沿用简化命令:默认执行 java -jar /app/app.jar
ENTRYPOINT ["java", "-jar"]
CMD ["/app/app.jar"]
docker build -t moshangjunmowen/jdk:v17.0.18 .

二、镜像使用

基础:

docker run -d  -p 8450:1024   -v $(pwd)/jun-admin-dev-3.0.0.jar:/app/app.jar   moshangjunmowen/jdk:v17.0.18

若想更改时区:

docker run -d -e TZ=UTC -p 8450:1024   -v $(pwd)/jun-admin-dev-3.0.0.jar:/app/app.jar   moshangjunmowen/jdk:v17.0.18

如果需要自定义端口(例如应用监听 8081,映射到宿主机 9090)

docker run --rm -p 9090:8081 \
-v $(pwd)/jun-admin-dev-3.0.0.jar:/app/app.jar \
jdk17-ubuntu --server.port=8081

如果需要传递其他 JVM 参数或应用参数

直接在镜像名后面添加即可,例如设置 JVM 内存:

docker run --rm -p 8080:8080 \
-v $(pwd)/jun-admin-dev-3.0.0.jar:/app/app.jar \
jdk17-ubuntu -Xmx512m --server.port=8080