web-dev-qa-db-ja.com

UnsatisfiedLinkError:/tmp/snappy-1.1.4-libsnappyjava.so共有ライブラリld-linux-x86-64.so.2の読み込みエラー:そのようなファイルまたはディレクトリはありません

Kafka kubernetesでStreamsアプリケーションを実行しようとしています。ポッドを起動すると、次の例外が発生します。

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
13
el323

エラーメッセージは、* libsnappyjava.soがld-linux-x86-64.so.2を見つけられないことを示しています。これはglibcダイナミックローダーですが、Alpineイメージはglibcでは実行されません。 Dockerfileにlibc6-compatパッケージをインストールすることにより、実行を試みることができます、例えば:

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

私の場合、欠落しているlibc6-compatをインストールしても機能しませんでした。アプリケーションはまだJava.lang.UnsatisfiedLinkErrorをスローします。

次に、ドッカーで/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のみが含まれています。

そこで、ld-linux-x86-64.so.2 dirのld-musl-x86_64.so.1にリンクされた/libという名前のファイルを追加し、問題を解決します。

私が使用する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
15
Kay Wu

この問題には2つの解決策があります。

  1. snappy-Java libがプリインストールされている他のベースイメージを使用できます。たとえば、openjdk:8-jre-slimはうまく機能します。

  2. そして、もう1つの解決策は、openjdk:8-jdk-Alpineイメージを基本イメージとして使用し、その後snappy-Java libを手動でインストールすることです。

FROM openjdk:8-jdk-Alpine
RUN apk update && apk add --no-cache gcompat
...
0
Ivan Kovbas

奇妙に思えますが、使用するdockerイメージ-openjdk:8u151-jdk-Alpine3.7に一貫性がなく、一部の動的にロードされたオブジェクトがパッケージに含まれていないか、このイメージで「ldconfig -v」を実行する必要があります共有オブジェクトのマップを更新するか、最後に、OSが.soオブジェクトを探している場所へのパスを持つ/etc/ld.so.confがあります。デバッグに時間を費やしたくない場合は、Java binaryを提供する別のdockerイメージを使用することを検討してください。

0
d0bry