基于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

openjdk-alpine镜像无法打印线程堆栈和内存堆栈问题的更多相关文章

  1. 程序中打印当前进程的调用堆栈(backtrace)

    为了方便调式程序,产品中需要在程序崩溃或遇到问题时打印出当前的调用堆栈.由于是基于Linux的ARM嵌入式系统,没有足够的空间来存放coredump文件. 实现方法,首先用__builtin_fram ...

  2. alpine 镜像 java 日志中文问号乱码

    0x00 前言 吾使用 alpine 作为基础镜像构建了 jdk8 镜像,为线上业务的 java 微服务架构提供支持,但是有容器运行的 java 服务中打印的日志中一旦出现中文,就会出现诸如以下的 ? ...

  3. JVM 找出最耗 cpu的线程 并打印线程栈

    监控JVM中最占cpu的线程 top -Hp pid JVM中最占cpu的线程ID -o THREAD,tid,time | awk 'BEGIN {count=0; } { if($2>0.3 ...

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

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

  5. 一个带bash,带glibc,中国时区,非root用户可运行crond命令的基于alpine镜像的Dockerfile

    这个镜像现在说起来简单, 带bash(增加执行脚本的兼容性,带GLIBC,中国时区,非root用户可运行crond命令-安全) 但让我开始陷入时,真的让我有段时间有点爆了. 比如,将filebeat文 ...

  6. 编译一个支持django及mysqlclient连接的alpine镜像

    一切都不难,难的就是在alpine镜像里. 最后,使用了网上编译好mysqlclient的镜像,才搞定. 记录一下. 一,基础镜像Dockerfile https://github.com/tnir/ ...

  7. Docker学习笔记:Alpine镜像+Python3安装+http服务器

    编写Dockerfile文件使用最新的Alpine镜像并安装Python3环境,如下: 因为python高于3.4则不会默认安装pip,需要手动安装. 试了很多其他办法都没安装上,唯有下载get-pi ...

  8. 一个神奇的bug:OOM?优雅终止线程?系统内存占用较高?

    摘要:该项目是DAYU平台的数据开发(DLF),数据开发中一个重要的功能就是ETL(数据清洗).ETL由源端到目的端,中间的业务逻辑一般由用户自己编写的SQL模板实现,velocity是其中涉及的一种 ...

  9. linux信号机制 - 用户堆栈和内核堆栈的变化【转】

    转自:http://itindex.net/detail/16418-linux-%E4%BF%A1%E5%8F%B7-%E5%A0%86%E6%A0%88 此文只简单分析发送信号给用户程序后,用户堆 ...

随机推荐

  1. Luogu P1069细胞分裂【分解质因数/数论】By cellur925

    题目传送门 发现这题真的坑超多啊...调了一晚上终于过了...我好菜啊qwq. 题意说的比较明白,让你求满足(si^k)%(m1^m2)==0的最小k值.然后看数据范围我们知道,我们肯定不能暴力的判断 ...

  2. android 多线程 AsyncTask 下载图片

    AsyncTask 下载图片 package com.test.network; import android.graphics.Bitmap; import android.graphics.Bit ...

  3. spring mvc No mapping found for HTTP request with URI [/web/test.do] in DispatcherServlet with name 'spring'

    原因: spring-servlet.xml 中 <context:component-scan base-package="com.test.controller" /&g ...

  4. 洛谷p2234/BZOJ1588 [HNOI2002]营业额统计

    题目链接: 洛谷 BZOJ 分析: 好像没有什么好说的就是一个平衡树的板子--唯一要注意的就是这里要找的并不是严格的前驱和后继,因为如果找到之前某一天的营业额和它相等那么差就是0,所以我们仍然在结构体 ...

  5. 1-18String类简介

    字符串(String)的不可变性 String类在java.lang包下面,是Object类的直接子类,通过API或者源码可以看到,String类是final修饰的,这说明String类不能被继承. ...

  6. 生产环境中配置的samba

    实验需求: 由于实验室纳新一帮新孩子,搭建samba主要是临时共享一些学习资源的,基本上大家用的都是windows.而且这个服务可以让他们在校园的里的个个角落都可以访问到,所以给挂了学校的公网,不过我 ...

  7. spark block读写流程分析

    之前分析了spark任务提交以及计算的流程,本文将分析在计算过程中数据的读写过程.我们知道:spark抽象出了RDD,在物理上RDD通常由多个Partition组成,一个partition对应一个bl ...

  8. (转 )Unity对Lua的编辑器拓展

    转 http://blog.csdn.net/ZhangDi2017/article/details/61203505 当前版本的Unity(截至Unity5.5.x)中TextAsset类不支持后缀 ...

  9. [转]ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL

    本文转自:http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中,我们介绍了如何利用基于ASP.NE ...

  10. oracle PL、SQL(概念)

    一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控制为一体的强大语言,PL/SQL不但支持更多的数据类型 ...