In der angezeigten Fehlermeldung:
Fehlermeldung vom Daemon: Container foo_1 kann nicht gestartet werden: \
Ausführbarer Datei nicht gefunden im $PATH
Es wird reklamiert, dass die ausführbare Datei grunt serve
nicht gefunden werden kann, nicht dass die ausführbare Datei grunt
mit dem Argument serve
nicht gefunden werden konnte. Die wahrscheinlichste Erklärung für diesen spezifischen Fehler ist die Ausführung des Befehls mit der Json-Syntax:
[ "grunt serve" ]
in etwas wie deiner Kompositionsdatei. Das ist ungültig, da die Json-Syntax erfordert, dass jeder Parameter, der normalerweise vom Shell auf jedem Leerzeichen für dich getrennt wird, aufgeteilt wird. Z.B.:
[ "grunt", "serve" ]
Der andere mögliche Weg, um beide in einen einzelnen Parameter zu bringen, ist, wenn du sie in einem einzelnen Argument in deinem docker run
Befehl zitierst, z.B.
docker run dein_image_name "grunt serve"
und in diesem Fall musst du die Anführungszeichen entfernen, damit sie als separate Argumente an den Ausführungsbefehl übergeben werden:
docker run dein_image_name grunt serve
Für andere, die dies sehen, bedeutet die Meldung Ausführbare Datei nicht gefunden
, dass Linux die Binärdatei, die du innerhalb deines Containers ausführen möchtest, mit dem Standardwert von $PATH
nicht sehen kann. Das könnte viele mögliche Ursachen haben, hier sind ein paar:
-
Hast du die Binärdatei in dein Image eingeschlossen? Wenn du ein Multistage-Image ausführst, stelle sicher, dass die Installation der Binärdatei in der letzten Phase erfolgt. Führe dein Image mit einer interaktiven Shell aus und überprüfe, ob es existiert:
docker run -it --rm dein_image_name /bin/sh
-
Dein Pfad beim Einloggen in den Container kann für die interaktive Shell geändert worden sein, insbesondere wenn du bash verwendest, daher musst du möglicherweise den vollständigen Pfad zur Binärdatei im Container angeben, oder du musst den Pfad in deiner Dockerdatei mit folgendem aktualisieren:
ENV PATH=$PATH:/custom/dir/bin
-
Die Binärdatei hat möglicherweise keine Ausführungsrechte, also musst du sie ausführbar machen. Mache das mit chmod:
RUN chmod 755 /custom/dir/bin/executable
-
Die Binärdatei kann dynamisch verknüpfte Bibliotheken enthalten, die im Image nicht vorhanden sind. Du kannst ldd
verwenden, um die Liste der dynamisch verknüpften Bibliotheken zu sehen. Ein häufiger Grund dafür ist das Kompilieren mit glibc (meisten Linux-Umgebungen) und Ausführen mit musl (bereitgestellt von Alpine):
ldd /path/to/executable
-
Wenn du das Image mit einem Volume ausführst, kann dieses Volume das Verzeichnis überlagern, in dem sich die ausführbare Datei in deinem Image befindet. Volumes fusionieren nicht mit dem Image, sie werden im Dateisystembaum genauso wie jede andere Linux-Dateisystem-Mount geladen. Das bedeutet, dass Dateien aus dem übergeordneten Dateisystem am Montagepunkt nicht mehr sichtbar sind. (Beachte, dass benannte Volumes von Docker aus dem Imageinhalt initialisiert werden, aber dies geschieht nur, wenn das benannte Volume leer ist.) Die Lösung besteht also darin, keine Volumes über Pfade zu mounten, in denen du ausführbare Dateien ausführen möchtest, die sich im Image befinden.
-
Wenn du eine Binärdatei für eine andere Plattform ausführst und binfmt_misc nicht mit der Option --fix-binary
konfiguriert hast, wird qemu nach dem Interpretierer im Container-Dateisystem-Namespace suchen, anstatt im Host-Dateisystem. Siehe diesen Ubuntu-Bug-Report für weitere Details zu diesem Problem.
-
Wenn der Fehler von einem Shell-Skript stammt, liegt das Problem oft in der ersten Zeile dieses Skripts (z.B. der #!/bin/bash
). Entweder existiert der Befehl aus einem oben genannten Grund nicht im Image, oder die Datei ist nicht als ASCII oder UTF-8 mit Linux-Zeilenumbrüchen gespeichert. Du kannst dos2unix
versuchen, um die Zeilenumbrüche zu reparieren, oder deine Git- und Editor-Einstellungen überprüfen.