82 votes

Comment rendre curl disponible en java basé sur l'image Docker: 8-jdk-alpine et garder l'image propre?

Nous avons du code java qui exécute la commande curl pour récupérer le résultat.

Nous avons créé un fichier jar et le fichier jar s'exécute correctement

Maintenant, lorsque nous essayons de dokerize le programme java (en utilisant jar) et d'exécuter l'application dans docker, nous obtenons cette erreur:

 errorjava.io.IOException: Cannot run program "curl": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at com.ps.api.common.CoreAPI_Spec.executeCoreAPI(CoreAPI_Spec.java:295)
    at com.ps.api.common.CoreAPI_Spec.getAccessTokens(CoreAPI_Spec.java:319)
 

Dockerfile utilisé:

 FROM ubuntu:16.04
MAINTAINER niro;

# Install prerequisites
RUN apt-get update && apt-get install -y \
curl

FROM java:8-jdk-alpine
# Set the working directory to /app
WORKDIR /Users/******/Desktop/CoreAPI_Jar

# Copy the current directory contents into the container at /app
ADD *******_Automation-0.0.1-SNAPSHOT-jar-with-dependencies.jar ******_Automation-0.0.1-SNAPSHOT-jar-with-dependencies.jar

# Run app.py when the container launches
CMD ["java", "-jar", "******-0.0.1-SNAPSHOT-jar-with-dependencies.jar"]
 

178voto

Imran Points 476

La Java de base de l'image que vous utilisez est Alpine Linux un et curl paquet doit également être téléchargé à partir de là. Voici Dockerfile j'ai utilisé pour les déploiements de Production.

FROM openjdk:8-jre-alpine

RUN apk add --update \
    curl \
    && rm -rf /var/cache/apk/*

Mise à jour 05/2019

Comme d'Alpine Linux 3.3 il existe un nouveau --no-cache option pour apk. Il permet aux utilisateurs d'installer des paquets avec un index est mis à jour et utilisé à la volée et non mis en cache localement:

FROM openjdk:8-jre-alpine

RUN apk --no-cache add curl

Cela évite la nécessité d'utiliser des --update et retirez /var/cache/apk/* fois terminé l'installation des packages.

De référence - https://github.com/gliderlabs/docker-alpine/blob/master/docs/usage.md et Merci @Daniel pour le commentaire.

12voto

Markus Points 1802

Votre exemple de fichier docker contient plusieurs instructions FROM . Ceci est valide mais comme l'indique la documentation, chaque FROM efface l'état des instructions précédentes. Et donc la nouvelle boucle installée est effacée après le deuxième FROM .

-6voto

David Maze Points 26689

La plupart des langues ont déjà à leur disposition des clients HTTP ces jours; vous ne devrait jamais être appeler à l' curl à partir d'un programme dans un langage plus sophistiqué qu'un script shell. java.net.URLConnection a été une partie de Java depuis Java 1.0 et (sans savoir pourquoi vous essayez de débourser pour cela), c'est presque certainement le bon outil ici.

En supposant que vous avez le contrôle de l' executeCoreAPI méthode de votre trace, vous devez la modifier pour utiliser le haut-Java client HTTP, et la suppression de tous les Dockerfile pièces essayez d'installer curl.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X