Docker容器中启动Arthas异常

使用Docker容器部署spring boot项目
Dockerfile文件内容如下

FROM openjdk:8-jre-alpine

#第一步将apk源替换为国内阿里源。没有第一步将下载难产
RUN echo -e 'https://mirrors.aliyun.com/alpine/v3.6/main/\nhttps://mirrors.aliyun.com/alpine/v3.6/community/' > /etc/apk/repositories \
    && set -xe \
    && apk --no-cache add ttf-dejavu fontconfig

#创建文件夹
RUN mkdir -p /work

WORKDIR /work

ARG JAR_FILE=app.jar

COPY ${JAR_FILE} app.jar

EXPOSE 80

ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"

CMD java -jar app.jar $JAVA_OPTS

使用build命令生成镜像并运行

docker build -t app .
docker run -d -p 8080:8080 --name app app

在Docker容器启动Arthas

docker exec -it a05430507a7d /bin/sh
wget https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

遇到问题:Can not find java process. Try to run jps command lists the instrumented Java HotSpot VMs on the target system.
jre-alpine默认没有安装jps,无法通过jps查找java进程

直接指定进程号:
java -jar arthas-boot.jar 1
再次遇到问题:Exception in thread "main" java.lang.IllegalArgumentException: Can not find tools.jar under java home: /usr/lib/jvm/java-1.8-openjdk/jre, please try to start arthas-boot with full path java. Such as /opt/jdk/bin/java -jar arthas-boot.jar
因为jre-alpine中没有tools.jar文件

找一个linux版本java中的tools.jar文件,拷贝到容器中
docker cp /data/tools.jar ac69a820acf6d71://usr/lib/jvm/java-1.8-openjdk/lib

再次启动arthas
java -jar arthas-boot.jar 1
遇到问题:com.sun.tools.attach.AttachNotSupportedException: Unable to get pid of LinuxThreads manager thread
因为Docker与Open JDK之间存在bug,java应用做为进程pid值为1时,会出现这个问题

解决方式:

  1. 在Dockerfile中引入tini,由它管理进程
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"

RUN apk --update --no-cache add tini
ENTRYPOINT ["tini"]

CMD java -jar app.jar $JAVA_OPTS
  1. 从linux版本的jre/lib中,拷贝tools.jar到容器中
docker build -t app .
docker run -d -p 8080:8080 --name app app

docker exec -it a05430507a7d /bin/sh
wget https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

docker cp /data/tools.jar ac69a820acf6d71://usr/lib/jvm/java-1.8-openjdk/lib
docker exec -it ac69a820acf6d71 /bin/sh
wget https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar

相关文章:
Alpine镜像中执行jstack、arthas等命令提示Unable to get pid of LinuxThreads manager thread
在Docker中使用Arthas诊断
在docker中使用arthas

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GalenZhang888

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

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

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

打赏作者

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

抵扣说明:

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

余额充值