Java - Docker не может установить зависимости - Html2Pdf library - PullRequest
3 голосов
/ 06 марта 2019

Я создаю Java-приложение, которое я буду размещать в Docker-контейнере.Частью этого приложения является использование этой библиотеки:

https://github.com/wooio/htmltopdf-java

Он берет URL-адрес и преобразует его в документ PDF.Однако при запуске файла .jar через докер я получаю сообщение об ошибке, что в нем отсутствуют собственные зависимости:

java.lang.UnsatisfiedLinkError: Unable to load library '/tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so': Native library (tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so) not found in resource path

Это задокументировано в последнем разделе ссылки выше, чтодля правильной работы этих библиотек:

  • libc6 (или glibc) libx11 libxext libxrender libstdc ++ libssl1.0 freetype fontconfig

Я изменил свой Dockerfile, чтобы попытаться установитьэти зависимости в сборке Docker:

FROM openjdk:8-jdk-alpine

RUN sh -c 'apk update && apk add libssl1.0 libx11 libxext libxrender libstdc++ freetype fontconfig'

COPY server/target/server-0.0.1-SNAPSHOT.jar app.jar

ENTRYPOINT ["java", "-jar", "app.jar"]

Я новичок в Docker, но я нашел этот фрагмент кода в выпуске github repo .Но я все еще не могу заставить его работать.

Можете ли вы найти здесь проблему, почему я не могу запустить программу?

Редактировать:

Я все еще получаю ошибку java.lang.UnsatisfiedLinkError: Unable to load library '/tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so': Native library (tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so) not found in resource path

Но когда SSHing в контейнер Docker и заглядывает в tmp -файл io.woo.htmltopdf -библиотека в списке.Путь tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so также существует в контейнере Docker.

Может быть что-то с настройками пути?Что приложение Java как-то не использует правильный путь?

Запускаемый app.jar находится в корневой папке, где также находится папка tmp, поэтому она должна найти ее?

Ответы [ 3 ]

2 голосов
/ 12 марта 2019

Мне удалось обойти эту проблему, используя собственную библиотеку wkhtmltopdf вместе с java-оболочкой wkhtmltopdf .

1 голос
/ 11 марта 2019

Alpine Linux построен на musl libc, а не на glibc.Я предполагаю, что ваша нативная библиотека не совместима с musl.

Вместо этого вы можете попробовать openjdk:8-slim.Этот построен на Debian, он немного больше, чем образ на основе alpine, но он сможет запускать библиотеки, созданные для glibc.

Вам нужно использовать apt для установки дополнительных пакетов и немногонеобходимо выяснить, какие пакеты предоставляют необходимые библиотеки.

Попробуйте вместо этого запустить Dockerfile со следующими строками:

FROM openjdk:8-slim

RUN apt-get update && apt-get install -y --no-install-recommends \
      libc6 \
      libx11-6 \
      libxext6 \
      libxrender1 \
      libstdc++ \
      libssl1.0 \
      libfreetype6 \
      fontconfig \
   && apt-get clean \
   && rm -rf /var/lib/apt/lists/*

Это создает образ объемом 1,37 Гб, большинство из которыхот установки libstdc ++ и всех его зависимостей.Здесь может быть возможность для оптимизации (вам действительно нужен полный C ++ Stdlib для правильной работы приложения?).Без этого пакета размер изображения падает до 256 МБ.

1 голос
/ 06 марта 2019

У меня также были проблемы с альпийскими изображениями, если вы не обращаете внимания на размер изображения, я бы вместо этого попытался использовать openjdk:8 в качестве предоставленного вами изображения.

...