docker · Docker
Die Meldung
exec /usr/local/bin/entrypoint.sh: exec format error
Was es bedeutet
Der Kernel hat den Header dieser ausführbaren Datei nicht erkannt, und heute ist das fast immer eine Architekturdiskrepanz — ein auf Apple Silicon gebautes arm64-Image läuft auf einem amd64-Host, oder umgekehrt. Ein Shell-Skript ohne erste Zeile #!/bin/sh erzeugt denselben Wortlaut. docker build --platform=linux/amd64 ist die übliche Antwort, beseitigt die Diskrepanz aber nicht, sondern überdeckt sie mit Emulation: alles, was über QEMU läuft, ist mehrfach langsamer als native Ausführung. Für ein Image, das bleiben soll, ist der Bau beider Architekturen mit buildx der Weg ohne Laufzeitkosten.
Die Lösung
docker build --platform=linux/amd64 .- Ausgegeben von
- docker
- Docker
- 12
Docker-Fehler werden erst lesbar, wenn man sie einer Schicht zuordnet — der Client erreicht den Daemon nicht, die Registry verweigert, ein RUN scheitert im Build, ein Container stirbt sofort beim Start: das sind vier verschiedene Probleme — und in der Build- und Laufzeitschicht ist die Zeile selbst nicht der Grund: der Grund steht in der Ausgabe des Befehls, der darin lief, und auch der Preis jeder Behebung unterscheidet sich je Schicht.
Eine Fehlermeldung lesen
- Von der ersten Zeile abwärts lesen. Weiter unten geht es um das Innere des Werkzeugs; die Ursache steht meist oben.
- Gibt es Datei und Zeilennummer, dort anfangen — nicht der oberste Stack-Frame, sondern die oberste Zeile, die eine eigene Datei nennt.
- Die Meldung wörtlich suchen, vorher aber eigene Pfade und Variablennamen entfernen; genau die verhindern den Treffer.
- Dieselbe Lage wird je Werkzeugversion anders formuliert. Passen die Treffer nicht, die Versionsnummer mit in die Suche.
- Vor dem Einfügen einer Lösung prüfen, was sie verwirft. Manches davon lässt sich nicht zurückholen.
Häufige Fragen
Q. Was bedeutet „exec /usr/local/bin/entrypoint.sh: exec format error“?
Der Kernel hat den Header dieser ausführbaren Datei nicht erkannt, und heute ist das fast immer eine Architekturdiskrepanz — ein auf Apple Silicon gebautes arm64-Image läuft auf einem amd64-Host, oder umgekehrt. Ein Shell-Skript ohne erste Zeile #!/bin/sh erzeugt denselben Wortlaut. docker build --platform=linux/amd64 ist die übliche Antwort, beseitigt die Diskrepanz aber nicht, sondern überdeckt sie mit Emulation: alles, was über QEMU läuft, ist mehrfach langsamer als native Ausführung. Für ein Image, das bleiben soll, ist der Bau beider Architekturen mit buildx der Weg ohne Laufzeitkosten.
Q. Wie behebe ich das?
docker build --platform=linux/amd64 . — vor dem Ausführen oben prüfen, was dieser Befehl verwirft.
Q. Welches Werkzeug gibt das aus?
docker. Es gehört zu Docker, und die Meldung hat 5 Wörter.