J'ai une image docker qui s'installe grunt
, mais quand j'essaye de l'exécuter, j'obtiens une erreur:
Error response from daemon: Cannot start container foo_1: \
exec: "grunt serve": executable file not found in $PATH
Si je lance bash en mode interactif, grunt
est disponible.
Qu'est-ce que je fais mal?
Voici mon Dockerfile:
# 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
? Ou pouvez-vous essayer d'exécuter la commande grunt en passant le chemin complet?CMD grunt?
Voulez-vous dire supprimer le["
et"]
?CMD ["grunt"]
pourCMD grunt
CMD ["grunt"]
utilisez un autre shell pour exécuter la commande, il est probable que dans ce shell, $ PATH ne soit pas défini.Réponses:
Lorsque vous utilisez le format exec pour une commande (par exemple
CMD ["grunt"]
, un tableau JSON avec des guillemets doubles), elle sera exécutée sans shell. Cela signifie que la plupart des variables d'environnement ne seront pas présentes.Si vous spécifiez votre commande comme une chaîne régulière (par exemple
CMD grunt
), la chaîne suivanteCMD
sera exécutée avec/bin/sh -c
.Plus d'informations à ce sujet sont disponibles dans la section CMD de la référence Dockerfile .
la source
sudo set
ou(exec set)
. Ceux-ci échoueront car ils exécutent les commandes sans shell (etset
sont un shell intégré). Cependant,sudo ls
et(exec ls)
fonctionnera car ills
s'agit d'un fichier binaire réel/bin/ls
.Ce fut le premier résultat sur google lorsque j'ai collé mon message d'erreur, et c'est parce que mes arguments étaient en panne.
Le nom du conteneur doit être après tous les arguments.
Mauvais:
Bien:
la source
J'ai trouvé le même problème. J'ai fait ce qui suit:
Quand je le change en
ça fonctionne bien.
la source
-v
ici.-v
est de lier monter un volume (comme décrit dansdocker run --help | grep "\-v"
), pour moi, je l'ai déjà/tmp
monté dans lesFile Sharing
(paramètres Docker), alors pourquoi devrais-je l'utiliser à nouveau?Il existe plusieurs raisons possibles à une erreur de ce type.
Dans mon cas, cela était dû au fait que le fichier exécutable (
docker-entrypoint.sh
du blog Ghost Dockerfile ) n'avait pas le mode de fichier exécutable après l'avoir téléchargé.Solution:
chmod +x docker-entrypoint.sh
la source
Un conteneur Docker peut être construit sans shell (par exemple https://github.com/fluent/fluent-bit-docker-image/issues/19 ).
Dans ce cas, vous pouvez copier un shell compilé statiquement et l'exécuter, par exemple
la source
Pour une raison quelconque, j'obtiens cette erreur à moins que j'ajoute le clarificateur "bash". Même l'ajout de "#! / Bin / bash" en haut de mon fichier de point d'entrée n'a pas aidé.
la source
COPY
, puisRUN chmod +x /compile_nibbler.sh
avant l'appel du point d'entrée.J'ai eu le même problème, après beaucoup de recherches sur Google, je n'ai pas pu trouver de solution.
Soudain, j'ai remarqué ma stupide erreur :)
Comme mentionné dans les documents , la dernière partie de
docker run
la commande que vous souhaitez exécuter et ses arguments après le chargement du conteneur.PAS LE NOM DU RÉCIPIENT !!!
C'était mon embarrassante erreur.
Ci-dessous, je vous ai fourni l'image de ma ligne de commande pour voir ce que j'ai fait de mal.
Et c'est le correctif tel que mentionné dans les documents .
la source
pour le faire fonctionner, ajoutez une référence douce à / usr / bin:
ln -s $ (quel nœud) / usr / bin / node
ln -s $ (dont npm) / usr / bin / npm
la source