默认情况下,我们使用的都是 jre 版本的 openjdk,当容器启动卡住不动的时候,看不出来任何问题。
此时如果能 dump 就能知道线程在干啥,也能找到一些大概的问题。
此时 jre 版本的镜像就不够用了。
切换 jre 为 jdk 版本
只切换为 jdk 还不够,还会遇到 Unable to get pid of LinuxThreads manager thread 的错误。
创建可以 dump 用的基础镜像
参考前面文章,创建如下镜像:
FROM openjdk:8u191-jdk-alpine3.9
RUN apk add --no-cache tini
ENTRYPOINT ["tini"]
修改项目使用的镜像和启动方式
假设上面创建的镜像名为 openjdk:8u191-jdk-alpine3.9-tini
FROM openjdk:8u191-jdk-alpine3.9-tini
COPY app.jar /opt/dubbo-app/app.jar
WORKDIR /opt/dubbo-app
EXPOSE 20880
ENTRYPOINT ["/sbin/tini", "--", "java", "-jar", "app.jar"]
启动镜像后进入容器
jps 查看 pid
jstack -l pid 查看线程信息
关于此次 BUG
经过查看堆栈和代码,发现是 Dubbo 连接 zookeeper 时,用了 CountDownLatch ,由于通过环境变量配置的 ZOOKE