Ich versuche, ein neues Docker-Image für unseren Entwicklungsprozess zu erstellen, indem ich cpanm
eine Reihe von Perl-Modulen als Basis-Image für verschiedene Projekte installiere.
Gibt während der Entwicklung der Docker-Datei cpanm
einen Fehlercode zurück, da einige der Module nicht sauber installiert wurden.
Ich bin mir ziemlich sicher, dass ich noch apt
einige Dinge installieren muss.
Meine Frage ist, wo finde ich das /.cpanm/work
in der Ausgabe angegebene Verzeichnis, um die Protokolle zu überprüfen? Wie kann ich im allgemeinen Fall das Dateisystem eines fehlgeschlagenen docker build
Befehls überprüfen ?
Morgen bearbeiten Nachdem find
ich die Kugel gebissen und einen ausgeführt hatte, entdeckte ich
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
Ist das zuverlässig oder ist es besser, einen "nackten" Container zu bauen und Dinge manuell auszuführen, bis ich alle Dinge habe, die ich brauche?
/var/lib/docker/aufs/diff/3afa404e[...]/.cpanm
sind Interna von Docker und ich würde mich nicht mit ihnenAntworten:
Jedes
RUN
Mal, wenn Docker einen Befehl aus einer Docker-Datei erfolgreich ausführt , wird eine neue Ebene im Image-Dateisystem festgeschrieben. Praktischerweise können Sie diese Ebenen-IDs als Bilder verwenden, um einen neuen Container zu starten.Nehmen Sie die folgende Docker-Datei:
und baue es:
Sie können nun einen neuen Container aus starten
00f017a8c2a6
,044e1532c690
und5bd8172529c1
:Natürlich möchten Sie vielleicht eine Shell starten, um das Dateisystem zu erkunden und Befehle auszuprobieren:
Wenn einer der Dockerfile-Befehle fehlschlägt, müssen Sie nach der ID der vorhergehenden Ebene suchen und eine Shell in einem Container ausführen, der aus dieser ID erstellt wurde:
Einmal im Container:
Wenn Sie wirklich in der tatsächlichen Ebene experimentieren müssen, die fehlgeschlagen ist, anstatt in der letzten Arbeitsebene zu arbeiten, lesen Sie Drews Antwort .
quelle
docker run --rm -it <id_last_working_layer> bash -il
Versuchen Sie dann im Container den Befehl, der das Problem nicht reproduzieren konnte Korrigieren Sie den Befehl und testen Sie ihn. Aktualisieren Sie schließlich Ihre Docker-Datei mit dem festen Befehl.docker diff <container>
eine gründliche Liste der spezifischen Dateisystemänderungen erhalten, die auf dieser bestimmten Ebene vorgenommen wurden (Dateien, die für dieses Image im gesamten Dateisystem hinzugefügt, gelöscht oder geändert wurden).Unable to find image 'd5219f1ffda9:latest' locally
. Ich war jedoch durch die verschiedenen Arten von IDs verwirrt. Es stellt sich heraus, dass Sie die IDs verwenden müssen, die direkt hinter den Pfeilen stehen, nicht die, die "Running in ..." sagen.Die oberste Antwort funktioniert in dem Fall, dass Sie den Status unmittelbar vor dem fehlgeschlagenen Befehl überprüfen möchten.
In der Frage wird jedoch gefragt, wie der Status des ausgefallenen Containers selbst untersucht werden soll. In meiner Situation ist der fehlgeschlagene Befehl ein Build, der mehrere Stunden dauert. Das Zurückspulen vor dem fehlgeschlagenen Befehl und das erneute Ausführen dauert daher lange und ist nicht sehr hilfreich.
Die Lösung besteht darin, den fehlgeschlagenen Container zu finden:
Übertragen Sie es auf ein Bild:
Führen Sie dann das Image aus [falls erforderlich, führen Sie bash aus]:
Jetzt sehen Sie sich tatsächlich den Status des Builds zum Zeitpunkt des Fehlschlags an, anstatt zu dem Zeitpunkt, bevor der Befehl ausgeführt wurde, der den Fehler verursacht hat.
quelle
DOCKER_BUILDKIT=1
, um IhreDockerfile
Docker speichert den gesamten Dateisystemstatus nach jeder erfolgreichen
RUN
Zeile zwischen.Wohl wissend, dass:
RUN
Um den neuesten Status vor Ihrem fehlgeschlagenen Befehl zu überprüfen , kommentieren Sie ihn in der Docker-Datei (sowie in allen nachfolgendenRUN
Befehlen) ausdocker build
und führen Sie ihndocker run
erneut aus.RUN
Befehl zu überprüfen , fügen|| true
Sie ihn einfach hinzu , um den Erfolg zu erzwingen. Fahren Sie dann wie oben beschrieben fort (lassen Sie alle nachfolgendenRUN
Befehle auskommentieren, ausführendocker build
unddocker run
).Tada, Sie müssen sich nicht mit Docker-Interna oder Layer-IDs herumschlagen, und als Bonus minimiert Docker automatisch den Arbeitsaufwand, der erneut ausgeführt werden muss.
quelle
Das Debuggen von Build-Step-Fehlern ist in der Tat sehr ärgerlich.
Die beste Lösung, die ich gefunden habe, besteht darin, sicherzustellen, dass jeder Schritt, der echte Arbeit leistet, erfolgreich ist, und nach denjenigen, die fehlschlagen, eine Prüfung hinzuzufügen. Auf diese Weise erhalten Sie eine festgeschriebene Ebene, die die Ausgaben des fehlgeschlagenen Schritts enthält, die Sie überprüfen können.
Eine Docker-Datei mit einem Beispiel nach der
# Run DB2 silent installer
Zeile:quelle
Was ich tun würde, ist das Dockerfile unten und einschließlich der betreffenden Zeile zu kommentieren. Anschließend können Sie den Container ausführen und die Docker-Befehle von Hand ausführen und die Protokolle auf die übliche Weise anzeigen. ZB wenn das Dockerfile ist
und es stirbt an der Bar, die ich tun würde
Dann
quelle