4
votes

Java - Docker ne parvient pas à installer les dépendances - bibliothèque Html2Pdf

Je construis une application Java que je vais héberger dans un conteneur de docker. Une partie de cette application consiste à utiliser cette bibliothèque:

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

Il prend une URL et la convertit en un document PDF. Cependant, lors de l'exécution du fichier .jar via docker, j'obtiens l'erreur qu'il manque des dépendances natives:

java.lang.UnsatisfiedLinkError: Impossible de charger la bibliothèque '/ tmp /io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so ': bibliothèque native (tmp / io.woo.htmltopdf / wkhtmltox / 0.12.5 / libwkhtmltox.so) introuvable dans le chemin de la ressource

Ceci est documenté dans la dernière section du lien ci-dessus, qu'il a besoin de ces bibliothèques pour fonctionner correctement:

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

J'ai modifié mon Dockerfile pour essayer d'installer ces dépendances à la build du 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"]

Je suis nouveau dans docker , mais j'ai trouvé cet extrait de code dans un numéro du github repo . Mais je n'arrive toujours pas à le faire fonctionner.

Pouvez-vous repérer ici le problème, pourquoi je ne peux pas exécuter le programme?

Edit:

J'obtiens toujours l'erreur java.lang.UnsatisfiedLinkError: Impossible de charger la bibliothèque '/tmp/io.woo.htmltopdf/wkhtmltox/0.12.5 /libwkhtmltox.so ': Bibliothèque native (tmp / io.woo.htmltopdf / wkhtmltox / 0.12.5 / libwkhtmltox.so) introuvable dans le chemin de la ressource

Mais lors de la connexion SSH dans le conteneur Docker et en regardant dans le dossier tmp , la io.woo.htmltopdf -library est répertoriée. Le chemin tmp / io.woo.htmltopdf / wkhtmltox / 0.12.5 / libwkhtmltox.so existe également dans le conteneur du docker.

Cela pourrait-il être quelque chose avec les paramètres de chemin? Que l'application Java n'utilise pas le chemin correct d'une manière ou d'une autre?

Le app.jar en cours d'exécution se trouve dans le dossier racine, où se trouve également le dossier tmp - il devrait donc le trouver?


1 commentaires

pouvez-vous me fournir le pot et toutes les autres étapes que la création de l'image pour que je puisse tester cela?


4 Réponses :


1
votes

J'ai également eu des problèmes avec les images alpines, si la taille de l'image ne vous dérange pas, j'essaierais d'utiliser openjdk: 8 comme image fournie à la place.


1 commentaires

Salut, merci pour votre réponse. Lorsque j'utilise openjdk: 8 , j'obtiens à la place l'erreur sh: 1: apk: not found . Et lors de l'exécution de l'application sans la commande apk add , j'obtiens toujours le java.lang.UnsatisfiedLinkError: Impossible de charger la bibliothèque '/tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/ libwkhtmltox.so ': bibliothèque native (tmp / io.woo.htmltopdf / wkhtmltox / 0.12.5 / libwkhtmltox.so) introuvable dans le chemin de la ressource



1
votes

Alpine Linux est construit sur musl libc, pas sur la glibc. Je suppose que votre bibliothèque native n'est pas compatible avec musl.

Vous pouvez essayer le openjdk: 8-slim à la place. Celui-ci est construit sur Debian, il est légèrement plus grand que l'image alpine, mais il sera capable d'exécuter des bibliothèques construites pour la glibc.

Vous devez utiliser apt pour installer des paquets supplémentaires, et un peu de recherche est nécessaire pour trouver les paquets qui fournissent les bibliothèques dont vous avez besoin.

Essayez de démarrer votre Dockerfile avec les lignes suivantes à la place:

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/*

Cela génère un 1.37 Image Gb cependant, dont la plupart provient de l'installation de libstdc ++ et de toutes ses dépendances. Il pourrait y avoir une opportunité d'optimisation ici (avez-vous vraiment besoin du Stdlib C ++ complet pour que votre application fonctionne correctement?). Sans ce package, la taille de l'image tombe à 256 Mo.


2 commentaires

Salut, merci pour la réponse. J'ai essayé la solution ci-dessus, mais j'obtiens toujours le java.lang.UnsatisfiedLinkError: Impossible de charger la bibliothèque '/tmp/io.woo.htmltopdf/wkhtmltox/0.12.5/libwkhtmltox.so': bibliothèque native (tmp / io.woo.htmltopdf / wkhtmltox / 0.12.5 / libwkhtmltox.so) introuvable dans l'erreur de chemin de ressource . Quand je SSH dans le conteneur de docker, les dépendances wkhtmltopdf sont dans le dossier tmp / , donc je ne comprends pas pourquoi je continue à recevoir cette erreur.


Il manque probablement une de ses dépendances à votre libwkhtmltox.so. lancez objdump -p libwkhtmltox.so pour vérifier les bibliothèques requises, et assurez-vous qu'elles sont toutes installées. Vous devrez probablement ajouter un autre package à la commande apt-get install.



2
votes

J'ai réussi à résoudre ce problème en utilisant la bibliothèque native wkhtmltopdf avec le wrapper java wkhtmltopdf .


0 commentaires

1
votes

J'ai eu le même problème, d'ailleurs j'ai utilisé la htmltopdf version 1.0.8 mais cela fonctionne sur mac os, mais quand j'ai utilisé des images docker. io / fabric8 / s2i-java: 3.0-java8 ça ne marche pas et ensuite j'essaye de descendre la version à 1.0.6 et ça marche

change

compile group: 'io.woo', name: 'htmltopdf', version: '1.0.6'

à

compile group: 'io.woo', name: 'htmltopdf', version: '1.0.8' 


0 commentaires