388 Stimmen

Docker: ausführbare Datei nicht im $PATH gefunden

Ich habe ein Docker-Image, das grunt installiert, aber wenn ich versuche, es auszuführen, erhalte ich einen Fehler:

Fehlerantwort vom Daemon: Container foo_1 kann nicht gestartet werden: \
    exec: "grunt serve": ausführbare Datei nicht im $PATH gefunden

Wenn ich bash im interaktiven Modus ausführe, ist grunt verfügbar.

Was mache ich falsch?

Hier ist meine Dockerfile:

# https://registry.hub.docker.com/u/dockerfile/nodejs/ (basierend auf ubuntu:14.04)
FROM dockerfile/nodejs

MAINTAINER Mein Name, ich@email.com

ENV HOME /home/web
WORKDIR /home/web/site

RUN useradd web -d /home/web -s /bin/bash -m

RUN npm install -g grunt-cli
RUN npm install -g bower

RUN chown -R web:web /home/web
USER web

RUN git clone https://github.com/repo/site /home/web/site

RUN npm install
RUN bower install --config.interactive=false --allow-root

ENV NODE_ENV development

# Port 9000 für den Server
# Port 35729 für Livereload
EXPOSE 9000 35729
CMD ["grunt"]

14voto

Parsa Punkte 2818

Ich hatte das gleiche Problem, nach viel Googeln konnte ich nicht herausfinden, wie man es behebt.

Plötzlich bemerkte ich meinen dummen Fehler :)

Wie in den Dokumenten erwähnt, ist der letzte Teil von docker run der Befehl, den Sie ausführen möchten, und dessen Argumente nach dem Hochfahren des Containers.

NICHT DER CONTAINERNAME !!!

Das war mein peinlicher Fehler.

Im Folgenden habe ich Ihnen das Bild meiner Befehlszeile zur Verfügung gestellt, um zu sehen, was ich falsch gemacht habe.

Und das ist die Lösung, wie in den Dokumenten erwähnt.

Bildbeschreibung hier eingeben

10voto

Gajus Punkte 61796

Ein Docker-Container kann ohne Shell erstellt werden (z. B. https://github.com/fluent/fluent-bit-docker-image/issues/19).

In diesem Fall können Sie eine statisch kompilierte Shell kopieren und ausführen, z. B.

docker create --name temp-busybox busybox:1.31.0
docker cp temp-busybox:/bin/busybox busybox
docker cp busybox mycontainerid:/busybox
docker exec -it mycontainerid /bin/busybox sh

3voto

BMitch Punkte 183873

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.

3voto

Ali Fazlolahi Punkte 31

In meinem Fall habe ich die Parameter falsch angeordnet. Bewegen Sie alle Schalter vor dem Bildnamen.

2voto

Ich habe diese Fehlermeldung bekommen, als ich das Alpine-Basisbild erstellt habe:

FEHLER: für web  Kann Service web nicht starten: OCI-Laufzeit konnte nicht erstellt werden: container_linux.go:380: Starten des Containerprozesses verursachte: exec: "bash": Ausführbare Datei nicht gefunden im $PATH: unbekannt

In meiner docker-compose-Datei hatte ich die Befehlsanweisung, bei der der Befehl mit bash ausgeführt wurde und bash nicht mit dem Alpine-Basisbild geliefert wird.

command: bash -c "python manage.py runserver 0.0.0.0:8000"

Dann habe ich festgestellt und den Befehl mit sh (Shell) ausgeführt. Es hat bei mir funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X