finestra mobile: file eseguibile non trovato in $ PATH


217

Ho un'immagine docker che si installa grunt, ma quando provo a eseguirla, viene visualizzato un errore:

Error response from daemon: Cannot start container foo_1: \
    exec: "grunt serve": executable file not found in $PATH

Se corro bash in modalità interattiva, gruntè disponibile.

Che cosa sto facendo di sbagliato?

Ecco il mio Dockerfile:

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

MAINTAINER My Name, me@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 for server
# Port 35729 for livereload
EXPOSE 9000 35729
CMD ["grunt"]

potresti provare a costruire la finestra mobile usando CMD grunt? O potresti provare a eseguire il comando grunt passando l'intero percorso?
mgaido,

@ mark91, per favore, potresti approfondire ciò che stai chiedendo di ricostruire usando CMD grunt?Intendi eliminare ["e "]?
Steve Lorimer,

L'ho appena provato - e ha funzionato - grazie! Quindi, per chiunque entri, cambia CMD ["grunt"]inCMD grunt
Steve Lorimer il

10
Questo perché se si CMD ["grunt"]utilizza un'altra shell per eseguire il comando, è probabile che in quella shell $ PATH non sia impostato.
Mgaido,

Risposte:


198

Quando si utilizza il formato exec per un comando (ad es CMD ["grunt"]. Un array JSON con virgolette doppie) verrà eseguito senza shell. Ciò significa che la maggior parte delle variabili di ambiente non sarà presente.

Se specifichi il tuo comando come una normale stringa (ad es. CMD grunt), La stringa successiva CMDverrà eseguita con /bin/sh -c.

Maggiori informazioni al riguardo sono disponibili nella sezione CMD del riferimento Dockerfile .


2
Questo è un link alla parte CMD del documento di riferimento docs.docker.com/engine/reference/builder/#cmd
Calvin

Scusa questa domanda stupida, ma come puoi eseguire un comando linux senza shell? Quale sarebbe l'equivalente per farlo su una macchina linux (non usando la finestra mobile)?
Wisbucky,

1
Per rispondere alla mia domanda, è simile a fare sudo seto (exec set). Quelli falliranno perché eseguono i comandi senza una shell (ed setè una shell incorporata). Tuttavia, sudo lse (exec ls)funzionerà perché lsè un vero file binario /bin/ls.
wisbucky

316

Questo è stato il primo risultato su Google quando ho incollato il mio messaggio di errore, ed è perché i miei argomenti erano fuori servizio.

Il nome del contenitore deve essere dopo tutti gli argomenti.

Male:

docker run <container_name> -v $(pwd):/src -it

Buona:

docker run -v $(pwd):/src -it <container_name>

132
Se leggi sempre attentamente la documentazione prima di iniziare a scrivere codice, non faresti mai nulla. Quando hai comprato la tua nuova auto, hai letto il manuale di 200 pagine prima di portarlo a casa? No. E quando si è verificato un problema con la tua auto, l'hai cercata per prima o hai preso il manuale? Questo è assolutamente ragionevole, posso solo immaginare tutte le persone che l'hanno trovato utile ma non hanno fatto clic sul pulsante di votazione! La cosa irragionevole è che questa risposta totalmente non correlata è il primo risultato di Google per questo messaggio di errore o che la finestra mobile non è intuitiva e non perdona. Saluti.
sarink

8
In molti script l'ordine delle bandiere non è importante, quindi posso capire perché questo può accadere a chiunque. La risposta è abbastanza utile Inutile dire che il messaggio di errore dalla finestra mobile non è affatto utile.
marios,

9
Wow, avrei lottato per un po 'se non per questa risposta. Perché UNIX non ha già un parser di argomenti CLI standard, flessibile e potente? ...
lleaff

1
Questo è stato il problema per me. Mettere il nome del contenitore alla fine sembrava funzionare
Rob Segal,

3
Sono stato fuorviato dalla risposta accettata, volevo scrivere la mia, ma sembra che sia già qui. Quindi posso confermare che questo risolve il problema ...
Arturas M

24

Ho trovato lo stesso problema. Ho fatto quanto segue:

docker run -ti devops -v /tmp:/tmp /bin/bash

Quando lo cambio a

docker run -ti -v /tmp:/tmp devops /bin/bash

funziona benissimo.


1
Ha funzionato per me amico, ma non capisco l'uso di -vqui. -vè legare mount a volume (come descritto in docker run --help | grep "\-v"), per me, ho già /tmpmontato in File Sharing(Impostazioni Docker), quindi perché dovrei usarlo di nuovo?
Ahmad,

12

Esistono diverse ragioni possibili per un errore come questo.

Nel mio caso, era dovuto al file eseguibile ( docker-entrypoint.shdal blog Ghost Dockerfile ) privo della modalità file eseguibile dopo che l'avevo scaricato.

Soluzione: chmod +x docker-entrypoint.sh


Questo è il commento che mi ha indicato la risposta giusta. Ho dovuto copiare il file e poi modificarlo.
Beyondeteal

7

Un contenitore Docker potrebbe essere creato senza shell (ad es. Https://github.com/fluent/fluent-bit-docker-image/issues/19 ).

In questo caso, è possibile copiare una shell compilata staticamente ed eseguirla, ad es

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

4

Per qualche motivo, ottengo quell'errore a meno che non aggiunga il chiarificatore "bash". Anche l'aggiunta di "#! / Bin / bash" all'inizio del mio file entrypoint non ha aiutato.

ENTRYPOINT [ "bash", "entrypoint.sh" ]

@SteveLorimer, sì. Ho fatto un COPYe poi RUN chmod +x /compile_nibbler.shprima della chiamata entrypoint.
oltre il

1

Ho avuto lo stesso problema, dopo un sacco di ricerche su Google, non sono riuscito a scoprire come risolverlo.

All'improvviso ho notato il mio stupido errore :)

Come menzionato nei documenti , l'ultima parte di docker runè il comando che si desidera eseguire e i suoi argomenti dopo aver caricato il contenitore.

NON IL NOME DEL CONTENITORE !!!

Quello è stato il mio imbarazzante errore.

Di seguito ti ho fornito l'immagine della mia riga di comando per vedere cosa ho fatto di sbagliato.

E questa è la correzione come menzionato nei documenti .

inserisci qui la descrizione dell'immagine


-7

per farlo funzionare aggiungere un riferimento morbido a / usr / bin:

ln -s $ (quale nodo) / usr / bin / node

ln -s $ (quale npm) / usr / bin / npm


1
Si prega di aggiungere una descrizione su come lo aiuterà.
Mathews Sunny,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.