在alpine / Jprofile 10中运行jpenable时出现UnsatisfiedLinkError

当运行jpenable以允许在运行JDK 8的alpine:3.3容器中对Jprofiler10进行概要分析时,我收到了一个UnsatisfiedLinkErrorexception。 有任何想法吗?

ERROR: The agent could not be loaded: Picked up _JAVA_OPTIONS: -Xmx1024m Exception in thread "main" java.lang.UnsatisfiedLinkError: /opt/jprofiler10/bin/ linux-x64/libattach.so: Error relocating /opt/jprofiler10/bin/linux-x64/libattac h.so: __strcpy_chk: symbol not found at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824) at java.lang.Runtime.load0(Runtime.java:809) at java.lang.System.load(System.java:1086) at com.jprofiler.attach.bbbload(ejt:6) at com.jprofiler.attach.bbiloadLibraryPath(ejt:49) at com.jprofiler.attach.ab(ejt:92) at com.jprofiler.attach.aa(ejt:74) at com.jprofiler.attach.a.main(ejt:116) 

所以,我会回答我自己的问题。

首先 – 我注意到ldd在alpine:3.5 openjdk8-jre包中显示了大部分java本机库被破坏(不解析依赖库)。 我在这里找到了一个配置加载库路径的解决方案: https : //github.com/docker-library/openjdk/issues/77

使用以下内容创建/etc/ld-musl-x86_64.path修复了我在ldd中找到的大多数库问题。

 /lib /usr/lib /usr/local/lib /usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64 /usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/jli /usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server /opt/jprofiler10.1.1/bin/linux-x64/ 

但是Jprofiler10 tar文件中提供的/opt/jprofiler10.1.1/bin/linux-x64/libattach.so仍然被破坏,所以我删除了它 – 并使用了/ usr / lib / jvm / java中包含的libattach.so -1.8-openjdk / jre / lib / amd64目录。

以下Dockerfile显示了我如何构建容器 – 并修复了问题。

 FROM alpine:3.5 RUN apk --no-cache add \ openjdk8-jre-base \ libstdc++ COPY ld-musl-x86_64.path /etc/ld-musl-x86_64.path ADD jprofiler_linux_10_1_1.tar /opt/ RUN rm /opt/jprofiler10.1.1/bin/linux-x64/libattach.so 

在此之后 – 我能够将容器放入牧场主。

最后的步骤是将shell执行到容器中并运行jpenable以使Jprofiler工具能够创建与jvm的连接。

例如/opt/jprofiler10.1.1/bin/jpenable

然后我能够在端口8849上连接并分析应用程序。