Ich habe ein Docker-Image, das installiert wird grunt
, aber wenn ich versuche, es auszuführen, wird eine Fehlermeldung angezeigt:
Error response from daemon: Cannot start container foo_1: \
exec: "grunt serve": executable file not found in $PATH
Wenn ich bash im interaktiven Modus ausführe, grunt
ist verfügbar.
Was mache ich falsch?
Hier ist meine Docker-Datei:
# https://registry.hub.docker.com/u/dockerfile/nodejs/ (builds on ubuntu:14.04)
FROM dockerfile/nodejs
MAINTAINER My Name, [email protected]
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 for server
# Port 35729 for livereload
EXPOSE 9000 35729
CMD ["grunt"]
CMD grunt
? Oder können Sie versuchen, den Befehl grunt auszuführen, indem Sie den vollständigen Pfad übergeben?CMD grunt?
Sie damit, das["
und fallen zu lassen"]
?CMD ["grunt"]
zuCMD grunt
CMD ["grunt"]
eine andere Shell verwenden, um den Befehl auszuführen, in dieser Shell wahrscheinlich $ PATH nicht festgelegt wird.Antworten:
Wenn Sie das exec-Format für einen Befehl verwenden (z. B.
CMD ["grunt"]
ein JSON-Array mit doppelten Anführungszeichen), wird es ohne Shell ausgeführt. Dies bedeutet, dass die meisten Umgebungsvariablen nicht vorhanden sind.Wenn Sie Ihren Befehl als reguläre Zeichenfolge angeben (z. B.
CMD grunt
), wird die nachfolgende ZeichenfolgeCMD
mit ausgeführt/bin/sh -c
.Weitere Informationen hierzu finden Sie im CMD-Abschnitt der Dockerfile-Referenz .
quelle
sudo set
oder(exec set)
. Dieseset
schlagen fehl, weil sie die Befehle ohne Shell ausführen (und eine integrierte Shell ist). Allerdingssudo ls
und(exec ls)
wird funktionieren, dals
es sich um eine tatsächliche Binärdatei handelt/bin/ls
.Dies war das erste Ergebnis bei Google, als ich meine Fehlermeldung einfügte, und das liegt daran, dass meine Argumente nicht in Ordnung waren.
Der Containername muss nach allen Argumenten stehen.
Schlecht:
Gut:
quelle
Ich habe das gleiche Problem gefunden. Ich habe folgendes gemacht:
Wenn ich es ändere
es funktioniert gut.
quelle
-v
hier nicht.-v
Um ein Volume zu binden (wie in beschriebendocker run --help | grep "\-v"
), habe ich es bereits/tmp
in denFile Sharing
(Docker-Einstellungen) gemountet. Warum sollte ich es also erneut verwenden?Es gibt mehrere mögliche Gründe für einen solchen Fehler.
In meinem Fall lag es daran, dass der ausführbaren Datei (
docker-entrypoint.sh
aus dem Ghost-Blog Dockerfile ) der ausführbare Dateimodus fehlte, nachdem ich sie heruntergeladen hatte.Lösung:
chmod +x docker-entrypoint.sh
quelle
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
quelle
Aus irgendeinem Grund wird dieser Fehler angezeigt, es sei denn, ich füge den "Bash" -Klärer hinzu. Selbst das Hinzufügen von "#! / Bin / bash" am Anfang meiner Einstiegspunktdatei hat nicht geholfen.
quelle
COPY
und dannRUN chmod +x /compile_nibbler.sh
vor dem Entrypoint-Anruf gemacht.Ich hatte das gleiche Problem. Nach vielem googeln konnte ich nicht herausfinden, wie ich es beheben konnte.
Plötzlich bemerkte ich meinen dummen Fehler :)
Wie in den Dokumenten erwähnt , ist der letzte Teil
docker run
der Befehl, den Sie ausführen möchten, und seine Argumente nach dem Laden des Containers.NICHT DER BEHÄLTERNAME !!!
Das war mein peinlicher Fehler.
Unten habe ich Ihnen das Bild meiner Befehlszeile zur Verfügung gestellt, um zu sehen, was ich falsch gemacht habe.
Und dies ist das Update, wie in den Dokumenten erwähnt .
quelle
Damit es funktioniert, fügen Sie einen weichen Verweis auf / usr / bin hinzu:
ln -s $ (welcher Knoten) / usr / bin / node
ln -s $ (welche npm) / usr / bin / npm
quelle