docker镜像验签问题-番外1-dockerfile中使用alpine运行java应用的问题
背景
一个java应用占用cpu过高,需要查看线程信息。但是无法使用jstack命令。
复现
以如下一个简单的dockerfile为例。
FROM openjdk:8-jdk-alpine
ENV LANG="en_US.UTF-8"
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
WORKDIR /app
COPY /target/user-app.jar /app/user-app.jar
EXPOSE 8003
ENTRYPOINT ["java","-jar","/app/user-app.jar"]启动后进入该容器中无法执行jstack命令,报错如下:
/app # jps
1 user-app.jar
170 Jps
/app # jstack 1 > a.log
1: Unable to get pid of LinuxThreads manager thread使用arthas也有同样的错误信息。
原因
- Alpine 使用 musl libc 而非 glibc
Alpine 的基础镜像是 musl libc,而 HotSpot 的一些 JVM 工具(如 jstack)依赖 glibc 的线程实现。当 jstack 尝试获取 LinuxThreads 管理线程 PID 时,musl 实现和 glibc 不兼容,所以报错。 - JDK 与操作系统匹配问题
你在 Alpine 上使用的 JDK 可能是官方的 OpenJDK,但编译时假设的系统是 glibc 环境。在 Alpine 上,这类工具往往不能完全正常工作。
解决方案
- 换基础镜像为 Debian / Ubuntu 官方 OpenJDK 镜像,如
openjdk-8-jdk或openjdk:8u322-jdk-bullseye
作者:张三 创建时间:2025-11-28 10:46
最后编辑:张三 更新时间:2025-11-30 19:09
最后编辑:张三 更新时间:2025-11-30 19:09