使用jlink制作的自定义JRE在Docker Alpine中执行java命令提示未找到
解决Alpine镜像中运行自定义JRE提示"java: not found"的问题
问题原因
构建阶段使用的gradle:7.5.1-jdk17-jammy是基于Ubuntu(GNU C库/glibc)的镜像,而Alpine Linux默认使用musl libc,两者的C库实现不兼容。你用jlink生成的自定义JRE二进制文件是针对glibc编译的,在musl环境下动态链接器无法找到依赖的glibc库,因此会出现看似文件不存在的错误(实际是依赖缺失)。
解决方案
有两种可行的解决方式:
1. 在Alpine中安装glibc兼容层
Alpine提供了gcompat包来兼容glibc程序,只需在Alpine阶段添加安装命令即可:
FROM gradle:7.5.1-jdk17-jammy As build WORKDIR /build COPY my-source my-source RUN cd my-source && gradle clean build RUN jlink \ --module-path /... \ --add-modules ... \ --output jre-custom \ --strip-debug \ --no-header-files \ --no-man-pages \ --compress 2 FROM alpine:latest WORKDIR /deployment # 安装glibc兼容层 RUN apk add --no-cache gcompat COPY --from=build /build/jre-custom jre-custom/ COPY --from=build /build/my-source/build/libs/*.jar build/app.jar CMD ["jre-custom/bin/java","-jar","build/app.jar"] EXPOSE 3009
2. 改用基于glibc的轻量镜像
如果不想依赖兼容层,可以替换Alpine为基于glibc的轻量级镜像,比如debian:bookworm-slim,这样无需额外安装依赖,直接运行自定义JRE即可:
FROM gradle:7.5.1-jdk17-jammy As build WORKDIR /build COPY my-source my-source RUN cd my-source && gradle clean build RUN jlink \ --module-path /... \ --add-modules ... \ --output jre-custom \ --strip-debug \ --no-header-files \ --no-man-pages \ --compress 2 FROM debian:bookworm-slim WORKDIR /deployment COPY --from=build /build/jre-custom jre-custom/ COPY --from=build /build/my-source/build/libs/*.jar build/app.jar CMD ["jre-custom/bin/java","-jar","build/app.jar"] EXPOSE 3009
内容的提问来源于stack exchange,提问作者Dilermando Lima
相关产品推荐
相关产品推荐

