欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > linux >内容正文

linux

docker报错:Unable to get pid of LinuxThreads manager thread及openjdk-alpine镜像无法打印线程堆栈和内存堆栈问题

发布时间:2025/1/21 linux 27 豆豆
生活随笔 收集整理的这篇文章主要介绍了 docker报错:Unable to get pid of LinuxThreads manager thread及openjdk-alpine镜像无法打印线程堆栈和内存堆栈问题 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

基于openjdk:8u171-alpine构建的java镜像,使用jstack命令打印线程的时候会提示以下错误:

/opt # ps -ef PID USER TIME COMMAND 1 root 0:28 /usr/lib/jvm/java-1.8-openjdk/bin/java -jar /test/lib/test.jar 66 root 0:00 /bin/sh 70 root 0:00 ps/opt # jstack 1 1: Unable to get pid of LinuxThreads manager thread

使用jmap命令尝试了一下,也是一样的错误。
换了一种启动方式,使用/bin/sh启动docker,然后进入docker手动启动java进程,然后再用jstack命令,就能正常打印。
换了一个centos镜像,手动安装openjdk,在启动docker的时候直接启动java进程,然后进入docker,使用jstack命令,也可以正常打印。

通过这几种尝试,得出的结论是:
使用centos+java镜像,可以正常打印线程堆栈,但是这种方式的缺陷就是镜像太大,大约600M左右;
使用alpine+java镜像,以/bin/sh方式启动docker,然后手动启动java进程,这时java进程的PID不为1,这种方式能够正常打印线程堆栈。这种方式缺点就是java进程如果异常退出了,docker不会检测到,所以无法做自动重启等操作;
使用alpine+java镜像,如果是以直接运行java进程的方式启动docker,也就是说java进程的PID为1,这种方式无法正常打印线程堆栈。

查看了一下github上openjdk官方的问题答复,确实是存在这种情况,并且openjdk的维护成员看上去也无法解决这个问题。
但是有一个曲线解决方法,就是在启动docker的时候先运行一个tini进程,然后通过tini进程去运行java进程。
这种方式java进程的PID不为1,能够打印堆栈,同时如果java进程退出,tini也能检测到,并通知到docker,docker来做相关的处理,完美的解决了这个问题。

参考Dockerfile如下:

FROM openjdk:8u171-alpine RUN apk add tini ENTRYPOINT ["tini"]

这里的RUN命令指定在制作镜像的时候通过apk管理工具安装了tini程序。ENTRYPOINT命令指定在运行docker的时候要运行tini程序,具体的java程序作为参数传给tini。
我们有多个java微服务,所以不能把tini装在每个java微服务镜像中,而是装在我们自己的基础镜像中。

具体服务的Dockerfile如下:

FROM java ADD build/bootScripts /test/bin ADD build/libs /test/lib WORKDIR /test EXPOSE 8080 CMD /test/bin/test

这里的/test/bin/test就是传给tini的实际要执行的启动命令。

参考资料:
https://github.com/docker-library/openjdk/issues/76
https://github.com/krallin/tini/issues/8

https://www.cnblogs.com/lasdaybg/p/10218485.html

报错:jstack on alpine:Unable to get pid of LinuxThreads manager thread

解决方法:尝试把你的dockerfile 中启动java的方式改为以下方法:

ENTRYPOINT ["/bin/bash", "-c", "set -e && java -Xmx100m -jar /demo.jar"]

k8s 集群容器中集成arthas、netstat即时诊断分析工具

总结

以上是生活随笔为你收集整理的docker报错:Unable to get pid of LinuxThreads manager thread及openjdk-alpine镜像无法打印线程堆栈和内存堆栈问题的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。