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"]
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/*
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.
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
.