微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/wenti/3280446.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐