问题现象

最近在处理项目上问题发现之前同事构建的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等基础镜像封装

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

  1. 【k8s中无法使用jstack和arthas的解决方案】1: Unable to get pid of LinuxThreads manager thread

    使用alpine镜像,jstack和arthas等无法连接到pid为1的java进程 k8s容器中执行结果 / # jstack 1 1: Unable to get pid of LinuxThre ...

  2. 【解决了一个小问题】alpine镜像中,busybox的date命令获取昨天的日期

    直接上答案: date -d@"$(( `date +%s`-86400))" +"%Y-%m-%d"

  3. linux中执行java或者mvn命令提示没有权限解决办法

    $ chmod a+x /var/jenkins_home/jdk1.8.0_191/bin/java $ chmod a+x /var/jenkins_home/apache-maven-3.3.9 ...

  4. python中执行py文件出错(提示File “<stdin>”,line 1,SyntaxError:invalid syntax)

    解决办法: 上图中已通过输入python进入了python运行环境,出现>>>时候的不能再用python z.py 来运行hello.py文件: 应该通过exit()退出当前pyth ...

  5. sh: /etc/init.d/sshd: not found Docker中的Alpine镜像安装sshd无法启动

    问题描述 在Alpine镜像中安装了openssh-server和openssh之后,无法执行ssh localhost.发现未启动服务,开启服务时报以下错误 / # ls /etc/init.d/s ...

  6. 向docker镜像中传递变量的两种方式

    测试用到的python文件: #!/usr/bin/env python3 #conding: utf-8 from http.server import HTTPServer, BaseHTTPRe ...

  7. 在vim中执行外部命令

    11.7.5  在Vim编辑器中执行Shell命令 有时需要在Vim编辑器中执行Shell命令,例如需要验证一个Shell命令是否正确,以便写入脚本中:需要在文件中引用某个Shell命令的输入等.本小 ...

  8. Dockerfile 中的 COPY 与 ADD 命令

    Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令的基本功能,以及其异同点,然后总结其各自适合的应用场景. Build 上下文的概念 在使用 docker ...

  9. 【Docker】涨姿势,深入了解Dockerfile 中的 COPY 与 ADD 命令

    参考资料:https://www.cnblogs.com/sparkdev/p/9573248.html Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令 ...

随机推荐

  1. Android第五六周作业

    1.返回键实现对话框弹出是否退出应用程序 package com.example.zuoye1; import androidx.appcompat.app.AlertDialog; import a ...

  2. Linux 系统安装 AutoFs 挂载服务

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 作者: Escape 链接: https://escapelife.github.io/pos ...

  3. Java安全之SnakeYaml反序列化分析

    Java安全之SnakeYaml反序列化分析 目录 Java安全之SnakeYaml反序列化分析 写在前面 SnakeYaml简介 SnakeYaml序列化与反序列化 常用方法 序列化 反序列化 Sn ...

  4. SHCTF web题

    第一题:直接查看robots.txt,得到flag 第二题:他的题的意思通过get方式一个字符一个字符去猜如果对的话他下面的小方格就会亮起,用python写个脚本就过了 第三题:也是猜flag 解题方 ...

  5. Erdos-Renyi随机图的生成方式及其特性

    1 随机图生成简介 1.1 \(G_{np}\)和\(G_{nm}\) 以下是我学习<CS224W:Machine Learning With Graphs>[1]中随机图生成部分的笔记, ...

  6. 并发编程之volatile与JMM多线程内存模型

    一.通过程序看现象 在开始为大家讲解Java 多线程缓存模型之前,我们先看下面的这一段代码.这段代码的逻辑很简单:主线程启动了两个子线程,一个线程1.一个线程2.线程1先执行,sleep睡眠2秒钟之后 ...

  7. C#/VB.NET 创建图片超链接

    超链接(Hyperlink)可以看做是一个"热点",它可以从当前Web页定义的位置跳转到其他位置,包括当前页的某个位置.Internet.本地硬盘或局域网上的其他文件,甚至跳转到声 ...

  8. windows 文件hash校验,字符串加密,base64转换工具

    对下载的文件使用hash校验验证文件完整性 1 import hashlib 2 def md5(): 3 md5_value = hashlib.md5() 4 with open('C:\Inte ...

  9. 【多线程】可重入锁 ReentrantLock

    java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能.而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也 ...

  10. arts-week13

    Algorithm 992. Sort Array By Parity II - LeetCode Review https://tls.ulfheim.net/ HTTP协议图解 Tip linux ...