UnsatisfiedLinkError: /tmp/snappy-1.1.4-libsnappyjava.so Ошибка при загрузке общей библиотеки ld-linux-x86-64.so.2: нет такого файла или каталога

Я пытаюсь запустить приложение Kafka 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)

Раньше я пробовал запускать приложение 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

Я думаю, это проблема с архитектурой процессора. Вы проверяли Java и Linux, являются ли ОС и Java одной и той же аркой, как все 32-битные или 64-битные?

tommybee 11.05.2018 10:27

Не могли бы вы предоставить здесь вывод ldd / usr / bin / java (выполняется внутри этого докера) для дальнейшей диагностики?

d0bry 11.05.2018 13:23

@ d0bry Я отредактировал вопрос.

el323 11.05.2018 13:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
29
3
14 443
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Это кажется странным, но похоже, что образ докера, который вы используете - openjdk: 8u151-jdk-alpine3.7 несовместим, и некоторые динамически загружаемые объекты не включены в пакет, или вам нужно запустить «ldconfig -v» в этом образе, чтобы обновить карта общих объектов или, наконец, /etc/ld.so.conf с путями к местам, где ОС ищет объекты .so. Если вы не хотите терять время на его отладку, подумайте об использовании другого образа докера, предоставляющего двоичный файл Java. И последнее, но не менее важное: попросите средство на альпийском форуме.

Спасибо за ответ. Еще одна вещь, может быть, что-то не так с образом докера Кафки?

el323 11.05.2018 14:54

Сложно сказать. Требуется дополнительное исследование, чтобы найти причину проблемы. Я думаю, вы можете попробовать использовать образ докера от другого разработчика, чтобы Kafka работала.

d0bry 11.05.2018 18:27
Ответ принят как подходящий

В сообщении об ошибке указано, что * libsnappyjava.so не может найти ld-linux-x86-64.so.2. Это динамический загрузчик glibc, а образ Alpine не запускается с glibc. Вы можете попробовать запустить его, установив пакет libc6-compat в свой Dockerfile, например:

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

Это не решило проблему, у меня все еще была ошибка UnsatisfiedLinkError. Решение, упомянутое @HenningCash, решает проблему.

Pat 12.06.2020 18:13

В моем случае установка отсутствующего 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, связанный с 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

Достаточно установить gcompat вместо libc6-compat, который предоставляет /lib/ld-linux-x86-64.so.2: pkgs.alpinelinux.org/…

HenningCash 26.04.2019 10:56

Есть два решения этой проблемы:

  1. Вы можете использовать другой базовый образ с предустановленной библиотекой snappy-java. Например openjdk:8-jre-slim у меня отлично работает

  2. И другое решение - по-прежнему использовать образ openjdk:8-jdk-alpine в качестве базового, но затем установить snappy-java lib вручную:

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

Ваше предложение использовать slim на самом деле сработало для меня. Большое спасибо!

Vitaly Sazanovich 14.11.2019 15:34

Второе решение также работает, если ваш базовый образ - openjdk:8-alpine.

Bruno Gasparotto 03.09.2020 12:23

Я реализовал образ докера, с которым я запускаю микросервис Spring Boot с топологией 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, то правильный способ сделать это:

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 послужит вашей цели

в докере с альпийским ядром

запустить apk update && apk add --no-cache libc6-compat gcompat спаси мою жизнь

Мне не нужно добавлять libc6-compat в dockerFile
Поскольку файл /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

В моем контейнере нет ошибки при использовании сообщения при мгновенном сжатии

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)

Другие вопросы по теме