Tenho uma imagem do docker que é instalada grunt
, mas quando tento executá-la, recebo um erro:
Error response from daemon: Cannot start container foo_1: \
exec: "grunt serve": executable file not found in $PATH
Se eu executar o bash no modo interativo, grunt
estará disponível.
O que estou fazendo de errado?
Aqui está o meu 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 você pode tentar executar o comando grunt passando o caminho completo?CMD grunt?
Quer dizer, solte o["
e"]
?CMD ["grunt"]
paraCMD grunt
CMD ["grunt"]
usar outro shell para executar o comando, então nesse shell provavelmente não será definido $ PATH.Respostas:
Quando você usa o formato exec para um comando (por exemplo
CMD ["grunt"]
, uma matriz JSON com aspas duplas), ele será executado sem um shell. Isso significa que a maioria das variáveis de ambiente não estará presente.Se você especificar seu comando como uma sequência regular (por exemplo
CMD grunt
), a sequência posteriorCMD
será executada com/bin/sh -c
.Mais informações sobre isso estão disponíveis na seção CMD da referência do Dockerfile .
fonte
sudo set
or(exec set)
. Isso irá falhar porque eles executam os comandos sem um shell (eset
é um shell embutido). No entanto,sudo ls
e(exec ls)
funcionará porquels
é um arquivo binário real/bin/ls
.Este foi o primeiro resultado no google quando colei minha mensagem de erro e é porque meus argumentos estavam fora de ordem.
O nome do contêiner deve estar após todos os argumentos.
Ruim:
Boa:
fonte
Eu encontrei o mesmo problema. Eu fiz o seguinte:
Quando eu mudo para
Funciona bem.
fonte
-v
daqui.-v
é vincular a montagem de um volume (conforme descrito emdocker run --help | grep "\-v"
), para mim, eu já/tmp
montei nasFile Sharing
(configurações do Docker), então por que devo usá-lo novamente?Existem várias razões possíveis para um erro como este.
No meu caso, foi devido ao arquivo executável (
docker-entrypoint.sh
do Dockerfile do blog do Ghost ) não ter o modo de arquivo executável após o download.Solução:
chmod +x docker-entrypoint.sh
fonte
Um contêiner do Docker pode ser construído sem um shell (por exemplo, https://github.com/fluent/fluent-bit-docker-image/issues/19 ).
Nesse caso, você pode copiar um shell estaticamente compilado e executá-lo, por exemplo
fonte
Por algum motivo, recebo esse erro, a menos que adicione o clarificador "bash". Mesmo adicionando "#! / Bin / bash" ao topo do meu arquivo de ponto de entrada não ajudou.
fonte
COPY
e depoisRUN chmod +x /compile_nibbler.sh
antes da chamada do ponto de entrada.Eu tive o mesmo problema. Depois de pesquisar bastante, não consegui descobrir como corrigi-lo.
De repente, notei meu erro estúpido :)
Conforme mencionado nos documentos , a última parte
docker run
é o comando que você deseja executar e seus argumentos após carregar o contêiner.NÃO O NOME DO RECIPIENTE !!!
Esse foi o meu erro embaraçoso.
Abaixo, forneci uma imagem da minha linha de comando para ver o que fiz de errado.
E essa é a correção conforme mencionado nos documentos .
fonte
para fazê-lo funcionar, adicione uma referência suave a / usr / bin:
ln -s $ (qual nó) / usr / bin / node
ln -s $ (que npm) / usr / bin / npm
fonte