【问题解决】Alpine镜像中执行jstack、arthas等命令提示Unable to get pid of LinuxThreads manager thread

问题现象

最近在处理项目上问题发现之前同事构建的AlpineLinux的镜像不能执行jstack等JDK命令,报错如下。

Unable to get pid of LinuxThreads manager thread

问题原因

问题的根本原因有两点:

  1. Alpine Linux 使用的不是标准gnu libc (glibc),而是musl libc
  2. apk包管理器安装的OpenJDK是IceTea补丁版本的,已经停止维护了

这两个原因导致了一个神奇的现象:当Java进程PID=1时,通过OpenJDK8执行JDK命令调用底层时会提示Unable to get pid of LinuxThreads manager thread,这个错误信息来源于Alpine仓库中OpenJDK源码中的一个失误,没处理musl libc仍去调用了glibc的底层接口导致的。

如下是亚马逊工程师对此仓库中底层OpenJDK8源码做的patch修复。

https://git.alpinelinux.org/aports/tree/community/openjdk8/icedtea-issue13032.patch

解决方法

解决方法有以下几种:

方案1、添加 docker 启动参数

启动容器命令参考如下:

docker run -d --init 省略其他参数镜像名等

方案2、镜像安装tini,由它管理进程

Dockerfile中使用如下方式

RUN apk --update --no-cache add tini 
#利用ENTRYPOINT一定会执行的特点,将它作为PID=1托管进程
ENTRYPOINT ["tini"]
CMD java $JAVA_OPTS -jar app.jar

方案3、用Shell脚本启动Java进程

编写脚本 docker-entrypoint.sh

# !/bin/bash
java $JAVA_OPTS -jar app.jar

Dockerfile中使用如下方式

CMD /docker-entrypoint.sh

方案4、安装glibc

https://github.com/sgerrand/alpine-pkg-glibc

此方案仅适用于X86_64 CPU架构,分在线与离线安装两种方法,以下举例说明

Dockerfile中在线安装:

RUN curl -kLo /etc/apk/keys/sgerrand.rsa.pub  https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub && \
    curl -kLo glibc-2.35-r0.apk https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.35-r0/glibc-2.35-r0.apk && \
    apk add glibc-2.35-r0.apk && \
    rm -f glibc-2.35-r0.apk

方案5、推荐:换一种基于glibc的镜像

如 debian、ubuntu、centos等基础镜像封装

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东北小狐狸-Hellxz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值