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:
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?
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?
4 Réponses :
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. p >
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
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.
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.
J'ai réussi à résoudre ce problème en utilisant la bibliothèque native wkhtmltopdf
avec le wrapper java wkhtmltopdf .
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'
pouvez-vous me fournir le pot et toutes les autres étapes que la création de l'image pour que je puisse tester cela?