问题现象

最近在处理项目上问题发现之前同事构建的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、用Shell解释器启动Java进程

Dockerfile中使用如下方式

CMD /bin/sh -c "java $JAVA_OPTS -jar app.jar"

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

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

最新文章

  1. 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github
  2. SQL Server2008清除数据库日志
  3. Python时区转换
  4. 动态生成SQL执行语句
  5. jqeury 合并单元格
  6. 二模 (4) day1
  7. SSM整合配置
  8. cf C. Hacking Cypher
  9. 方向梯度直方图(HOG)和颜色直方图的一些比較
  10. 使用非 GUI 模式运行 JMeter 压力测试
  11. js面向对象oop编程
  12. 几款有用的AndroidStudio插件
  13. Python使用Plotly绘图工具,绘制柱状图
  14. Linux基础系统优化
  15. 2018-2019-2 网络对抗技术 20165308 Exp1 PC平台逆向破解
  16. Itellij Idea全局搜索
  17. C# 实现子窗体控制父窗体的方法
  18. Daily Scrumming* 2015.12.13(Day 5)
  19. label文字从左上角开始
  20. 单元测试+内存、SD卡、SP读写+XmlPullParser

热门文章

  1. 2021.07.20 P3951 小凯的疑惑(最大公因数,未证)
  2. Apache Doris 通过ODBC连接SQL Server
  3. MKL库矩阵乘法
  4. YOLO系列梳理(三)YOLOv5
  5. SSM框架中返回的是字符串还是页面跳转的问题
  6. Djang内置分页和自定义分页
  7. 团队Beta1
  8. IOC创建对象的方式
  9. 关于div及display
  10. 开源框架 WebFirst 一键生成项目,在线建表