UnsatisfiedLinkError: /tmp/snappy-1.1.4-libsnappyjava.so 加载共享库 ld-linux-x86-64.so.2 时出错:没有这样的文件或目录

Posted

技术标签:

【中文标题】UnsatisfiedLinkError: /tmp/snappy-1.1.4-libsnappyjava.so 加载共享库 ld-linux-x86-64.so.2 时出错:没有这样的文件或目录【英文标题】:UnsatisfiedLinkError: /tmp/snappy-1.1.4-libsnappyjava.so Error loading shared library ld-linux-x86-64.so.2: No such file or directory 【发布时间】:2018-10-21 14:49:41 【问题描述】:

我正在尝试在 kubernetes 中运行 Kafka Streams 应用程序。当我启动 pod 时,出现以下异常:

Exception in thread "streams-pipe-e19c2d9a-d403-4944-8d26-0ef27ed5c057-StreamThread-1"
java.lang.UnsatisfiedLinkError: /tmp/snappy-1.1.4-5cec5405-2ce7-4046-a8bd-922ce96534a0-libsnappyjava.so: 
Error loading shared library ld-linux-x86-64.so.2: No such file or directory 
(needed by /tmp/snappy-1.1.4-5cec5405-2ce7-4046-a8bd-922ce96534a0-libsnappyjava.so)
        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 org.xerial.snappy.SnappyLoader.loadNativeLibrary(SnappyLoader.java:179)
        at org.xerial.snappy.SnappyLoader.loadSnappyApi(SnappyLoader.java:154)
        at org.xerial.snappy.Snappy.<clinit>(Snappy.java:47)
        at org.xerial.snappy.SnappyInputStream.hasNextChunk(SnappyInputStream.java:435)
        at org.xerial.snappy.SnappyInputStream.read(SnappyInputStream.java:466)
        at java.io.DataInputStream.readByte(DataInputStream.java:265)
        at org.apache.kafka.common.utils.ByteUtils.readVarint(ByteUtils.java:168)
        at org.apache.kafka.common.record.DefaultRecord.readFrom(DefaultRecord.java:292)
        at org.apache.kafka.common.record.DefaultRecordBatch$1.readNext(DefaultRecordBatch.java:264)
        at org.apache.kafka.common.record.DefaultRecordBatch$RecordIterator.next(DefaultRecordBatch.java:563)
        at org.apache.kafka.common.record.DefaultRecordBatch$RecordIterator.next(DefaultRecordBatch.java:532)
        at org.apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.nextFetchedRecord(Fetcher.java:1060)
        at org.apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.fetchRecords(Fetcher.java:1095)
        at org.apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.access$1200(Fetcher.java:949)
        at org.apache.kafka.clients.consumer.internals.Fetcher.fetchRecords(Fetcher.java:570)
        at org.apache.kafka.clients.consumer.internals.Fetcher.fetchedRecords(Fetcher.java:531)
        at org.apache.kafka.clients.consumer.KafkaConsumer.pollOnce(KafkaConsumer.java:1146)
        at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:1103)
        at org.apache.kafka.streams.processor.internals.StreamThread.pollRequests(StreamThread.java:851)
        at org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:808)
        at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:774)
        at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:744)

之前我曾尝试使用 docker 容器启动 kafka 和 kafka-streams-app,它们运行良好。这是我第一次尝试使用 Kubernetes。

这是我的 DockerFile StreamsApp

FROM openjdk:8u151-jdk-alpine3.7

COPY /target/streams-examples-0.1.jar /streamsApp/

COPY /target/libs /streamsApp/libs

CMD ["java", "-jar", "/streamsApp/streams-examples-0.1.jar"]

我能做些什么来解决这个问题?请帮帮我。

编辑:

/ # ldd /usr/bin/java 
    /lib/ld-musl-x86_64.so.1 (0x7f03f279a000)
Error loading shared library libjli.so: No such file or directory (needed by /usr/bin/java)
    libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7f03f279a000)
Error relocating /usr/bin/java: JLI_Launch: symbol not found

【问题讨论】:

我认为这是关于 cpu arch 问题。你检查过 java 和 linux 操作系统和 java 是否像所有 32 位或 64 位一样是同一个拱门? 能否请您在此处提供 ldd /usr/bin/java 的输出(在此 docker 中执行)以进行进一步诊断? @d0bry 我已经编辑了问题。 【参考方案1】:

就我而言,安装缺少的 libc6-compat 不起作用。应用程序仍然抛出java.lang.UnsatisfiedLinkError

然后我在 docker 中发现,/lib64/ld-linux-x86-64.so.2 存在并且是指向/lib/libc.musl-x86_64.so.1 的链接,但/lib 只包含ld-musl-x86_64.so.1,而不是ld-linux-x86-64.so.2

所以我在/lib 目录中添加了一个名为ld-linux-x86-64.so.2 的文件链接到ld-musl-x86_64.so.1 并解决了问题。

我使用的Dockerfile:

FROM openjdk:8-jre-alpine
COPY entrypoint.sh /entrypoint.sh
RUN apk update && \
  apk add --no-cache libc6-compat && \
  ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2 && \
  mkdir /app && \
  chmod a+x /entrypoint.sh
COPY build/libs/*.jar /app
ENTRYPOINT ["/entrypoint.sh"]

总结:

RUN apk update && apk add --no-cache libc6-compat
ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2

【讨论】:

安装gcompat而不是提供libc6-compat/lib/ld-linux-x86-64.so.2就足够了:pkgs.alpinelinux.org/… 救了我的命。谢谢。因为图书馆已经在那里了。我刚刚添加了符号链接。【参考方案2】:

错误消息指出 *libsnappyjava.so 找不到 ld-linux-x86-64.so.2。这是一个 glibc 动态加载器,而 Alpine 映像不使用 glibc 运行。您可以尝试通过在 Dockerfile 中安装 libc6-compat 包来使其运行,例如:

RUN apk update && apk add --no-cache libc6-compat

【讨论】:

这并没有解决问题,我仍然有 UnsatisfiedLinkError。 @HenningCash 提到的解决方案解决了这个问题。【参考方案3】:

这个问题有两种解决方案:

    您可以使用预先安装了snappy-java lib 的其他基本映像。例如openjdk:8-jre-slim 适合我

    另一种解决方案是仍然使用openjdk:8-jdk-alpine 作为基础图像,然后手动安装snappy-java lib:

FROM openjdk:8-jdk-alpine
RUN apk update && apk add --no-cache gcompat
...

【讨论】:

您使用 slim 的建议实际上对我有用。非常感谢! 如果您的基础镜像是openjdk:8-alpine,第二种解决方案也适用【参考方案4】:

如果你是通过 build.sbt 添加 docker 文件,那么正确的做法是

dockerfile in docker := 
  val artifact: File = assembly.value
  val artifactTargetPath = s"/app/$artifact.name"

  new Dockerfile 
    from("openjdk:8-jre-alpine")
    copy(artifact, artifactTargetPath)
    run("apk", "add", "--no-cache", "gcompat")
    entryPoint("java", "-jar", artifactTargetPath)
  

安装 gcompat 将达到您的目的

【讨论】:

【参考方案5】:

看起来很奇怪,但是看起来你使用的docker镜像-openjdk:8u151-jdk-alpine3.7不一致,并且 某些动态加载的对象未包含在包中,或者您需要在此映像中运行“ldconfig -v”进行更新 共享对象的映射,或者最后是 /etc/ld.so.conf ,其中包含操作系统正在寻找 .so 对象的位置的路径。 如果您不想浪费时间调试它,请考虑使用另一个提供 java 二进制文件的 docker 镜像。最后但同样重要的是,在 alpine 论坛上寻求补救措施。

【讨论】:

感谢您的回答。还有一件事,会不会是Kafka的docker镜像有问题? 很难说。它需要额外的调查才能找到问题所在。我认为您可以尝试使用其他开发人员的 docker 映像来让 Kafka 正常工作。【参考方案6】:

我已经实现了一个 docker 镜像,我用它运行一个 Spring Boot 微服务,Kafka Stean Topology 运行良好。

我在这里分享 Dockerfile 文件。

FROM openjdk:8-jdk-alpine
# Add Maintainer Info
LABEL description="Spring Boot Kafka Stream IoT Processor"
# Args for image
ARG PORT=8080

RUN apk update && apk upgrade && apk add --no-cache gcompat
RUN ln -s /bin/bash /usr/bin
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app


COPY resources/wait-for-it.sh  wait-for-it.sh
COPY target/iot_processor.jar app.jar

RUN dos2unix wait-for-it.sh
RUN chmod +x wait-for-it.sh
RUN uname -a
RUN pwd
RUN ls -al

EXPOSE $PORT

CMD ["sh", "-c", "echo 'waiting for 300 seconds for kafka:9092 to be accessable before 
starting application' && ./wait-for-it.sh -t 300 kafka:9092 -- java -jar app.jar"]

希望对大家有所帮助

【讨论】:

【参考方案7】:

在 docker 中使用 alpine 内核

运行apk update &amp;&amp; apk add --no-cache libc6-compat gcompat 救我一命

【讨论】:

【参考方案8】:

我不需要在 dockerFile 中添加 libc6-compat 因为文件 /lib/libc.musl-x86_64.so.1 存在于我的容器中

在 dockerFile 中只添加

run ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2

我的容器在快速压缩时消费 msg 时没有错误

Exception in thread "streams-pipe-e19c2d9a-d403-4944-8d26-0ef27ed5c057-StreamThread-1"
java.lang.UnsatisfiedLinkError: /tmp/snappy-1.1.4-5cec5405-2ce7-4046-a8bd- 
922ce96534a0-libsnappyjava.so: 
Error loading shared library ld-linux-x86-64.so.2: No such file or directory 
(needed by /tmp/snappy-1.1.4-5cec5405-2ce7-4046-a8bd-922ce96534a0-libsnappyjava.so)
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)

【讨论】:

以上是关于UnsatisfiedLinkError: /tmp/snappy-1.1.4-libsnappyjava.so 加载共享库 ld-linux-x86-64.so.2 时出错:没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

谷歌或工具:UnsatisfiedLinkError

JNR UnsatisfiedLinkError

为啥我会在本机代码中收到此 UnsatisfiedLinkError?

UnsatisfiedLinkError探案录

java.lang.UnsatisfiedLinkError:java.library.path 中没有 jcryptoki

java.lang.UnsatisfiedLinkError - 运行 z/OS 应用程序时