docker : $ PATH에 실행 파일이 없습니다.


216

설치하는 도커 이미지가 grunt있지만 실행하려고하면 오류가 발생합니다.

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

대화식 모드에서 bash를 실행하면 grunt사용할 수 있습니다.

내가 뭘 잘못하고 있죠?

내 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"]

를 사용하여 도커를 만들려고 할 수 CMD grunt있습니까? 아니면 전체 경로를 전달하여 grunt 명령을 실행하려고 할 수 있습니까?
mgaido

@ mark91 당신은 당신이 사용하고 빌드를 요구하는지에 대한 정교한 수하십시오 CMD grunt?사람 드롭 음주 뜻 [""]?
Steve Lorimer

방금 시도해 보았습니다. 감사했습니다! 그래서 다른 사람이 들어오는에 대한 변경 CMD ["grunt"]CMD grunt
스티브 Lorimer가

10
당신이 경우에 때문이다 CMD ["grunt"]명령을 실행하기 위해 다른 쉘을 사용 그래서 쉘 $ PATH에 가능성이 설정되어서는 안된다.
mgaido

답변:


198

명령에 exec 형식을 사용하면 (예 : CMD ["grunt"]큰 따옴표가있는 JSON 배열) 셸 없이 실행 됩니다 . 이는 대부분의 환경 변수가 존재하지 않음을 의미합니다.

명령을 일반 문자열 (예 :)로 지정하면 CMD grunt이후 문자열 CMD이로 실행됩니다 /bin/sh -c.

이에 대한 자세한 정보는 Dockerfile 참조 의 CMD 섹션에 있습니다.



이 바보 같은 질문을 실례하지만 쉘없이 리눅스 명령을 어떻게 실행할 수 있습니까? Linux 시스템에서 도커를 사용하지 않는 것과 동등한 기능은 무엇입니까?
wisbucky

1
내 자신의 질문에 대답하기 위해, 그것은 일을 유사하다 sudo set(exec set). 쉘없이 명령을 실행하기 때문에 실패 set합니다 (쉘 내장). 그러나, sudo ls하고 (exec ls)있기 때문에 작동 ls실제 바이너리 파일입니다 /bin/ls.
wisbucky

315

이것은 오류 메시지를 붙여 넣을 때 Google에서 처음으로 얻은 결과이며 내 주장이 잘못 되었기 때문입니다.

컨테이너 이름은 모든 인수 뒤에 있어야합니다 .

나쁜:

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

좋은:

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

132
코딩을 시작하기 전에 항상 설명서를 철저히 읽으면 아무 것도 할 수 없습니다. 새 차를 샀을 때 집으로 운전하기 전에 200 페이지 매뉴얼을 읽었습니까? 아닙니다. 자동차에 문제가 생겼을 때 먼저 구글을 봤습니까, 아니면 매뉴얼을 보셨습니까? 이것은 완전히 합리적입니다. 유용하다고 생각했지만 upvote 버튼을 클릭하지 않은 모든 사람들 만 상상할 수 있습니다! 불합리한 것은이 완전히 관련이없는 답변 이이 오류 메시지의 첫 번째 Google 결과이거나 도커 클리가 직관적이지 않고 용서스럽지 않다는 것입니다. 건배.
sarink

8
많은 스크립트에서 플래그의 순서는 중요하지 않으므로 이것이 왜 누군가에게 일어날 수 있는지 알 수 있습니다. 대답은 매우 도움이됩니다. 도커의 오류 메시지는 전혀 유용하지 않습니다.
마리오

9
와우, 나는이 답변이 아니라면 잠시 동안 고투했을 것입니다. 유닉스에 표준의 유연하고 강력한 CLI 인수 파서가없는 이유는 무엇입니까? ...
lleaff

1
이것은 나에게 문제였습니다. 마지막에 컨테이너 이름을 넣는 것이 효과가있는 것 같습니다
Rob Segal

3
나는 받아 들여진 대답에 오도되었고 내 자신을 쓰고 싶었지만 이미 여기에있는 것 같습니다. 그래서 이것이 문제를 해결한다는 것을 확인할 수 있습니다 ...
Arturas M

24

나는 같은 문제를 발견했다. 나는 다음을 수행했다.

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

내가 그것을 바꿀 때

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

잘 작동합니다.


1
그것은 나를 위해 일했지만, 나는 -v여기 의 사용법을 이해하지 못한다 . -v볼륨을 바인드 마운트하는 것입니다 ( docker run --help | grep "\-v")에서 이미 (Docker 설정)에 /tmp마운트 File Sharing했으므로 다시 사용해야하는 이유는 무엇입니까?
Ahmad

12

이와 같은 오류가 발생할 수있는 몇 가지 이유가 있습니다.

내 경우에는, 그것은 (때문에 실행 파일이었다 docker-entrypoint.sh으로부터 유령 Dockerfile 블로그 내가 그것을 다운로드했던 한 후 실행 파일 모드를 결여).

해결책: chmod +x docker-entrypoint.sh


이것은 정답을 알려주는 의견입니다. 파일을 복사 한 다음 chmod해야했습니다.
beyondtheteal

7

Docker 컨테이너는 쉘없이 빌드 될 수 있습니다 (예 : https://github.com/fluent/fluent-bit-docker-image/issues/19 ).

이 경우 정적으로 컴파일 된 쉘을 복사하여 실행할 수 있습니다 (예 :

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

어떤 이유로 "bash"clarifier를 추가하지 않으면 오류가 발생합니다. 진입 점 파일 맨 위에 "#! / bin / bash"를 추가해도 도움이되지 않습니다.

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

@SteveLorimer, 그렇습니다. 내가했던 COPY한 후 RUN chmod +x /compile_nibbler.sh진입 점에 문의하기 전에.
thetertheteal

1

나는 같은 문제를 겪었다. 많은 인터넷 검색 후에 문제를 해결하는 방법을 찾을 수 없었다.

갑자기 나는 바보 같은 실수를 발견했다 :)

docs에서 언급했듯이 마지막 부분은 docker run컨테이너를로드 한 후 실행하려는 명령과 인수입니다.

컨테이너 이름이 아님 !!!

그것은 나의 당혹스러운 실수였다.

아래에서 나는 내가 잘못한 것을보기 위해 명령 줄 그림을 제공했습니다.

그리고 이것은 문서 에서 언급 한 수정 입니다.

여기에 이미지 설명을 입력하십시오


-7

작동하게하려면 / usr / bin에 대한 소프트 참조를 추가하십시오.

ln -s $ (어떤 노드) / usr / bin / node

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


1
그에게 도움이 될 방법에 대한 설명을 추가하십시오.
Mathews Sunny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.