Dockerfile Build - Fehler ignorieren?

109

Ich habe eine Docker-Datei. Beim Erstellen des Images schlägt der Build bei diesem Fehler fehl:

automake: error: no 'Makefile.am' found for any configure output
Error build: The command [/bin/sh -c aclocal && autoconf && automake -a] returned a non-zero code: 1

was in Wirklichkeit harmlos ist. Die Bibliothek wird einwandfrei erstellt, Docker stoppt den Build jedoch, sobald dieser Fehler auftritt. Kann ich Docker auf irgendeine Weise anweisen, dies einfach zu ignorieren?

Oskar
quelle

Antworten:

217

Sicher. Docker reagiert nur auf die Fehlercodes, die von den RUNShell-Skripten in der zurückgegeben werden Dockerfile. Wenn Sie Dockerfileso etwas haben wie:

RUN make

Sie könnten das ersetzen durch:

RUN make; exit 0

Dies gibt immer einen 0(Erfolgs-) Exit-Code zurück. Der Nachteil hierbei ist , dass Ihr Bild erfolgreich zu bauen erscheinen , selbst wenn es ist tatsächlich Fehler in dem Build - Prozess.

Larsks
quelle
2
Ich bin hierher gekommen, als ich versucht habe zu rennen service php7-fpm start. Es würde 1 zurückgeben und RUN würde fehlschlagen; using service php7-fpm start; service php7-fpm statusmacht den Trick - es scheint auch während des Builds ein Problem zu lösen, da beide Befehle, die getrennt ausgeführt werden, Probleme verursachen würden.
igorsantos07
Ich bin hierher gekommen, als ich versucht habe, Qt5 aus dem Quellcode zu erstellen. Es würde gut funktionieren, aber bei gleichzeitiger Erstellung in Kombination mit der Tatsache, dass beim Qt-Erstellungsprozess Build-Time-Tests von make ausgeführt werden (die absichtlich fehlschlagen), wurde mein RUN-Befehl mit Fehler (2) beendet. Dies wird hoffentlich das Problem lösen!
Lennart Rolland
32

Dies könnte für diejenigen von Interesse sein, deren potenzielle Fehler in ihren Bildern nicht harmlos genug sind , um unbemerkt / protokolliert zu bleiben . (Auch nicht genug rep. Um zu kommentieren, also hier als Antwort.)

Wie bereits erwähnt, besteht der Nachteil RUN make; exit 0darin, dass Sie nicht wissen, ob Ihr Build fehlgeschlagen ist. Verwenden Sie daher lieber etwas wie:

make test 2>&1 > /where/ever/make.log || echo "There were failing tests!"

Auf diese Weise werden Sie über das Docker-Image-Build-Prozessprotokoll benachrichtigt und können sehen, was genau während der makeAusführung (oder bei jeder anderen Ausführung, auf die dies nicht beschränkt ist) fehlerhaft war .

mths
quelle
Dies ist eine unterschätzte Antwort. Mein Anwendungsfall war, dass einige Paketlisten nicht erreichbar waren und apt-get update -yfehlschlugen.
Silviu Burcea
14

Sie können auch den Standard-Bash-Ignorierfehler verwenden. Dies || trueist hilfreich, wenn Sie sich mitten in einer Kette befinden:

RUN <first stage> && <job that might fail> || true && <next stage>
MortenB
quelle
genau das, was ich brauchte :) Was noch besser wäre, wäre zu scheitern, wenn der Job fehlschlug, aber nach der nächsten Phase (Bereinigung)
csomakk