Tengo una imagen acoplable que se instala grunt
, pero cuando intento ejecutarla, aparece un error:
Error response from daemon: Cannot start container foo_1: \
exec: "grunt serve": executable file not found in $PATH
Si ejecuto bash en modo interactivo, grunt
está disponible.
¿Qué estoy haciendo mal?
Aquí está mi 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
? ¿O puede intentar ejecutar el comando gruñido pasando la ruta completa?CMD grunt?
¿Quiere decir soltar el["
y"]
?CMD ["grunt"]
aCMD grunt
CMD ["grunt"]
utiliza otro shell para ejecutar el comando, es probable que en ese shell $ PATH no se establezca.Respuestas:
Cuando utiliza el formato exec para un comando (por ejemplo
CMD ["grunt"]
, una matriz JSON con comillas dobles), se ejecutará sin un shell. Esto significa que la mayoría de las variables de entorno no estarán presentes.Si especifica su comando como una cadena normal (por ejemplo
CMD grunt
), la cadena posteriorCMD
se ejecutará con/bin/sh -c
.Más información sobre esto está disponible en la sección CMD de la referencia de Dockerfile .
fuente
sudo set
o(exec set)
. Esos fallarán porque ejecutan los comandos sin un shell (yset
es un shell incorporado). Sin embargo,sudo ls
y(exec ls)
funcionará porquels
es un archivo binario real/bin/ls
.Este fue el primer resultado en Google cuando pegué mi mensaje de error, y es porque mis argumentos estaban fuera de orden.
El nombre del contenedor debe ser después de todos los argumentos.
Malo:
Bueno:
fuente
Encontré el mismo problema. Hice lo siguiente:
Cuando lo cambio a
funciona bien.
fuente
-v
aquí.-v
es unir el montaje de un volumen (como se describe endocker run --help | grep "\-v"
), para mí, ya lo he/tmp
montado en laFile Sharing
(Configuración de Docker), entonces, ¿por qué debería usarlo nuevamente?Hay varias razones posibles para un error como este.
En mi caso, se debió a que el archivo ejecutable (
docker-entrypoint.sh
del Dockerfile de Ghost blog ) no tenía el modo de archivo ejecutable después de haberlo descargado.Solución:
chmod +x docker-entrypoint.sh
fuente
Se puede construir un contenedor Docker sin un shell (por ejemplo, https://github.com/fluent/fluent-bit-docker-image/issues/19 ).
En este caso, puede copiar un shell compilado estáticamente y ejecutarlo, p. Ej.
fuente
Por alguna razón, obtengo ese error a menos que agregue el clarificador "bash". Incluso agregar "#! / Bin / bash" a la parte superior de mi archivo de punto de entrada no ayudó.
fuente
COPY
y luegoRUN chmod +x /compile_nibbler.sh
antes de la llamada del punto de entrada.Tuve el mismo problema, después de mucho googlear, no pude encontrar cómo solucionarlo.
De repente noté mi estúpido error :)
Como se menciona en los documentos , la última parte de
docker run
es el comando que desea ejecutar y sus argumentos después de cargar el contenedor.NO ES EL NOMBRE DEL CONTENEDOR !!!
Ese fue mi error vergonzoso.
A continuación, le proporcioné la imagen de mi línea de comando para ver qué he hecho mal.
Y esta es la solución como se menciona en los documentos .
fuente
para que funcione, agregue una referencia suave a / usr / bin:
ln -s $ (qué nodo) / usr / bin / node
ln -s $ (que npm) / usr / bin / npm
fuente