web-dev-qa-db-fra.com

Comment rendre curl disponible dans Docker basé sur une image Java: 8-jdk-Alpine et garder l'image propre?

Nous avons un code Java qui exécute une commande curl pour extraire le résultat.

Nous avons construit 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 le menu fixe, 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"]
17
user3356164

L'image de base Java que vous utilisez est celle d'Alpine Linux et le package curl doit également être téléchargé à partir de cet emplacement. Voici le fichier Docker que 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

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

FROM openjdk:8-jre-Alpine

RUN apk --no-cache add curl

Cela évite d'utiliser --update et de supprimer /var/cache/apk/* une fois l'installation des packages effectuée.

Référence - https://github.com/gliderlabs/docker-Alpine/blob/master/docs/usage.md et merci @Daniel pour le commentaire.

45
Imran

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

6
Markus

La plupart des langues ont des clients HTTP facilement disponibles ces jours-ci; vous ne devriez presque jamais appeler curl depuis un programme dans un langage plus sophistiqué qu'un script Shell. (Java.net.URLConnection fait partie de Java depuis Java 1.0 et (sans savoir pourquoi vous essayez de faire un shell pour cela), c'est presque certainement le bon outil ici.

En supposant que vous contrôliez la méthode executeCoreAPI à partir de votre trace, modifiez-la pour utiliser le client HTTP intégré Java et supprimez simplement toutes les parties Dockerfile qui tentent d’installer curl.

2
David Maze