Wie man curl verfügbar im Andockfenster Bild-basierte java:8-jdk-alpine und halten Sie das Bild sauber?
Wir sind mit java-code, der ausgeführt wird curl Befehl zu Holen, die einige Ergebnis.
Gebaut haben wir eine jar-Datei und die jar-Datei ausführt, feine
Nun, wenn wir versuchen, dokerize das java-Programm (mit Glas) und führen Sie die Anwendung im Andockfenster wir diese Fehlermeldung erhalten:
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 verwendet :
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"]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Java-Basis-image, das Sie verwenden, ist Alpine Linux, und curl-Paket muss auch von dort heruntergeladen. Hier ist Dockerfile, das ich verwendet habe für den Praxiseinsatz.
Update 05/2019
Als der Alpine Linux 3.3 gibt es eine neue
--no-cache
option fürapk
. Es ermöglicht Benutzern das installieren von Paketen mit einem index, der aktualisiert wird, und verwendet werden, on-the-fly und nicht lokal zwischengespeichert:Dies vermeidet die Notwendigkeit der Verwendung von
--update
und entfernen/var/cache/apk/*
wenn Sie fertig sind die Installation von Paketen.Referenz -
https://github.com/gliderlabs/docker-alpine/blob/master/docs/usage.md und Danke @Daniel für den Kommentar.
Ihrem Beispiel dockerfile enthält mehrere
FROM
Aussagen. Dies gilt aber, wie die Dokumentation sagt jederFROM
löscht den Bundesstaat aus früheren Anweisungen. Und so die frisch installierte curl ausgelöscht wird, nachdem die zweiteFROM
.curl
nicht als seine ausgelöscht.docker images
zeigen würde, wie Sie die Zwischenstufen als Unbenannte Bilder. Vielleicht ist es nur eine Frage der word-Nutzung allerdings. Wenn ich unter "ausgelöscht" glaube ich gelöscht, aber als ich sage, ich glaube nicht, dass es ist. Das heißt, der Staat der build ist gewischt, aber es scheint wie ein strittiger Punkt, es zu erwähnen, wenn man über die installierten Pakete, im Gegensatz zu Sachen wieWORKDIR
oderADD
-- vor allem da Ubuntu und Alpine nicht die gleiche Paket-manager, also die Befehle anders sein würde.Den meisten Sprachen zur Verfügung steht HTTP-clients in diesen Tagen; Sie sollte fast nie sein Aufruf an
curl
aus einem Programm in einer Sprache, die anspruchsvoller als ein shell-Skript. java.net.URLConnection wurde ein Teil der Java seit Java 1.0, und (ohne zu wissen, warum Sie versuchen, zu berappen für diese) es ist fast mit Sicherheit das richtige Werkzeug hier.Vorausgesetzt, Sie Steuern die
executeCoreAPI
Methode aus dem backtrace, sollten Sie es ändern, verwenden Sie die integrierte Java-HTTP-client, und löschen Sie einfach alle Dockerfile Teile, die versuchen, es zu installierencurl
.