J'ai une image de menu fixe qui installe grunt
, mais lorsque 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"]
Lorsque vous utilisez le format exec pour une commande (par exemple CMD ["grunt"]
, un tableau JSON avec des guillemets doubles), il sera exécuté sans sans Shell. Cela signifie que la plupart des variables d'environnement ne seront pas présentes.
Si vous spécifiez votre commande en tant que chaîne régulière (par exemple, CMD grunt
), la chaîne après CMD
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 .
Ce fut le premier résultat sur Google lorsque j'ai collé mon message d'erreur, et ce parce que mes arguments étaient hors d'usage.
Le nom du conteneur doit être after tous les arguments.
Mauvais:
docker run <container_name> -v $(pwd):/src -it
Bien:
docker run -v $(pwd):/src -it <container_name>
J'ai trouvé le même problème. J'ai fait ce qui suit:
docker run -ti devops -v /tmp:/tmp /bin/bash
Quand je le change en
docker run -ti -v /tmp:/tmp devops /bin/bash
ça fonctionne bien.
Il existe plusieurs raisons possibles pour une erreur comme celle-ci.
Dans mon cas, cela était dû au fichier exécutable (docker-entrypoint.sh
du Ghost blog Dockerfile ) dépourvu du mode fichier exécutable après l'avoir téléchargé.
Solution: chmod +x docker-entrypoint.sh
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.
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
Pour une raison quelconque, je reçois cette erreur à moins d’ajouter le clarificateur "bash". Même ajouter "#!/Bin/bash" en haut de mon fichier de point d'entrée n'a pas aidé.
ENTRYPOINT [ "bash", "entrypoint.sh" ]