UnsatisfiedLinkError: /tmp/snappy-1.1.4-libsnappyjava.so Error loading shared library ld-linux-x86-64.so.2: No such file or directory
UnsatisfiedLinkError: /tmp/snappy-1.1.4-libsnappyjava.so Error loading shared library ld-linux-x86-64.so.2: No such file or directory
我正在尝试 运行 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.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.access00(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
好像很奇怪,不过貌似你用的docker镜像- openjdk:8u151-jdk-alpine3.7不一致,而且
一些动态加载的对象未包含在包中,或者您需要在此图像中 运行 “ldconfig -v” 进行更新
共享对象的映射,或者最后,有 /etc/ld.so.conf 以及 OS 正在寻找 .so 对象的地方的路径。
如果您不想浪费时间调试它,请考虑使用另一个提供 java 二进制文件的 docker 图像。最后但同样重要的是,在alpine论坛上寻求补救措施。
错误消息指出 *libsnappyjava.so 找不到 ld-linux-x86-64.so.2。这是一个 glibc 动态加载器,而 Alpine 图像不 运行 带有 glibc。您可以尝试通过在您的 Dockerfile 中安装 libc6-compat 包来获取它 运行ning,例如:
RUN apk update && apk add --no-cache libc6-compat
就我而言,安装缺少的 libc6-compat 无效。应用程序仍然抛出 java.lang.UnsatisfiedLinkError
.
然后我发现在docker中,/lib64/ld-linux-x86-64.so.2
存在并且是一个link到/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
linked 到 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
这个问题有两种解决方法:
您可以使用其他一些预装了 snappy-java
库的基础映像。例如 openjdk:8-jre-slim
适合我
另一种解决方案是仍然使用 openjdk:8-jdk-alpine
图像作为基础图像,然后手动安装 snappy-java
库:
FROM openjdk:8-jdk-alpine
RUN apk update && apk add --no-cache gcompat
...
我已经实现了一个 docker 图像,我 运行 一个 Spring 引导微服务与 Kafka Strean 拓扑完美地工作。
这里分享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"]
希望对大家有所帮助
如果您通过 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 将达到您的目的
在 docker 中使用 alpine 内核
运行 apk update && apk add --no-cache libc6-compat gcompat
拯救我的生命
我不需要在 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
我的容器在 snappy 压缩时使用 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)
我正在尝试 运行 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.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.access00(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
好像很奇怪,不过貌似你用的docker镜像- openjdk:8u151-jdk-alpine3.7不一致,而且 一些动态加载的对象未包含在包中,或者您需要在此图像中 运行 “ldconfig -v” 进行更新 共享对象的映射,或者最后,有 /etc/ld.so.conf 以及 OS 正在寻找 .so 对象的地方的路径。 如果您不想浪费时间调试它,请考虑使用另一个提供 java 二进制文件的 docker 图像。最后但同样重要的是,在alpine论坛上寻求补救措施。
错误消息指出 *libsnappyjava.so 找不到 ld-linux-x86-64.so.2。这是一个 glibc 动态加载器,而 Alpine 图像不 运行 带有 glibc。您可以尝试通过在您的 Dockerfile 中安装 libc6-compat 包来获取它 运行ning,例如:
RUN apk update && apk add --no-cache libc6-compat
就我而言,安装缺少的 libc6-compat 无效。应用程序仍然抛出 java.lang.UnsatisfiedLinkError
.
然后我发现在docker中,/lib64/ld-linux-x86-64.so.2
存在并且是一个link到/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
linked 到 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
这个问题有两种解决方法:
您可以使用其他一些预装了
snappy-java
库的基础映像。例如openjdk:8-jre-slim
适合我另一种解决方案是仍然使用
openjdk:8-jdk-alpine
图像作为基础图像,然后手动安装snappy-java
库:
FROM openjdk:8-jdk-alpine
RUN apk update && apk add --no-cache gcompat
...
我已经实现了一个 docker 图像,我 运行 一个 Spring 引导微服务与 Kafka Strean 拓扑完美地工作。
这里分享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"]
希望对大家有所帮助
如果您通过 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 将达到您的目的
在 docker 中使用 alpine 内核
运行 apk update && apk add --no-cache libc6-compat gcompat
拯救我的生命
我不需要在 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
我的容器在 snappy 压缩时使用 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)