web-dev-qa-db-de.com

So lösen Sie "Ich kann keine .Id vom Docker abrufen", wenn Sie ein Docker-Image mit Jenkins-Pipeline erstellen

Ich verwende eine Jenkins-Pipeline, um eine Dockerfile zu erstellen. 

Die Andockdatei durchläuft erfolgreich alle Schritte und erstellt das Andockbild.

Wie gezeigt:

Step 16/19 : FROM base AS final
 ---> <id>
Step 17/19 : WORKDIR /app
 ---> Using cache
 ---> <id>
Step 18/19 : COPY --from=publish /app .
 ---> Using cache
 ---> <id>
Step 19/19 : ENTRYPOINT ["", "myapp.dll"]
 ---> Using cache
 ---> <id>
Successfully built cb3y81938e88
Successfully tagged myapp:latest

Danach schlägt die Shell jedoch mit dem folgenden Fehler fehl:

Java.io.IOException: Cannot retrieve .Id from 'docker inspect base AS final'

Warum wird dieser Fehler ausgegeben, obwohl das Docker-Image erfolgreich erstellt wurde? Wenn ich dies auf meinem lokalen Rechner ausführen, wird der Befehl mit "Erfolgreich getaggt myapp: latest"

Meine Docker-Version ist 18.03.1-ce.

Jede Hilfe zu diesem Thema wäre sehr dankbar!

12
fuzzi

Es scheint, dass es einen Fehler in diesem Jenkins-Plugin gibt.

Sie können versuchen, den mehrstufigen Buildnamen ("AS final" zu entfernen, da Sie ihn nicht benötigen):

FROM base
(....)

Wenn Sie jedoch wirklich auf ein zuvor erstelltes Image (mehrstufig) verweisen müssen, kann eine Problemumgehung die Verwendung von --copy-from 0 (0,1,2 anstelle des Aliasnamens) erfordern.

Verwandte Probleme in Jenkins


Bearbeiten

Dokumentieren Sie hier die vom OP gefundene Lösung:

Ich habe das funktioniert, indem ich nicht die Jenkinsfile-Pipeline-Datei verwendet habe, sondern stattdessen eine Shell im Jenkins-Job ausführte, um den Docker-Buildbefehl auszuführen. (Docker-Build -t Latest-Build.)

13
Robert

Ich bekomme dieses Problem, weil ich --target=<foo> Verwende, um mein Image nur bis zu einem bestimmten Punkt zu erstellen.

Mein Dockerfile sieht also so aus

FROM maven:3.6-jdk-8 AS BUILD

.. do build ..

FROM openjdk:8

COPY --from=BUILD /myapp/bin my_jar_file

Und mein Build mit docker.build(<tag>, "--target=BUILD .") schlägt fehl mit:

Java.io.IOException: Cannot retrieve .Id from 'docker inspect openjdk:8'

Dies liegt daran, dass Jenkins versucht, den zweiten FROM openjdk:8 In der Docker-Datei zu überprüfen, und dass Docker dieses Image nicht heruntergefahren hat und es für docker inspect Nicht verfügbar ist.

Ich habe eine Reihe von Problemumgehungen zur Verfügung:

  1. Stellen Sie sicher, dass das Image trotzdem verfügbar ist, indem Sie vor dem Erstellen docker pull openjdk:8 Ausführen
  2. Entfernen Sie --target=BUILD Aus meinem docker.build - Befehl und lassen Sie es das Ganze bauen (für mich kein allzu großes Problem, da der Build der teuerste Teil ist).
  3. Vermeiden Sie die Verwendung von docker.build Und nur sh "docker build --target=BUILD .

Im Moment bin ich nicht sicher, mit welchem ​​ich gehen werde

2
Steve Mason

Mit Docker 18.09 bin ich auf dasselbe Problem gestoßen, habe aber keinen mehrstufigen Build verwendet. In meinem Fall bekam ich:

Java.io.IOException: Cannot retrieve .Id from 'docker inspect centos:7'

Der erste Schritt in meiner Dockerfile war:

FROM centos:7

Ich konnte das Problem mit docker pull centos:7 beheben. Danach konnte der Jenkins-Build erfolgreich abgeschlossen werden.

0
Andrew Schlei

In meiner spezifischen Situation hatten meine Jenkins zwei Knoten, Master und Slave. Wenn der Job am Slave-Knoten ausgeführt wurde, schlug der Job fehl. Bei Ausführung auf dem Masterknoten wird der Job erfolgreich ausgeführt.

Wie kann ich einen Jenkins-Job auf einem bestimmten Knoten mit Jenkinsfile ausführen? Beispiel:

node('master') {}
0
Janderson Silva