도커: $PATH에서 실행 파일을 찾을 수 없습니다.
저는 를 설치하는 .grunt
하면 합니다: , 하려고 가 합니다 합니다 가 하려고
Error response from daemon: Cannot start container foo_1: \
exec: "grunt serve": executable file not found in $PATH
모드에서 하면 bash 하면,grunt
를 사용할 수 있습니다.
내가 뭘 잘못하고 있는 거지?
여기 내 도커 파일이 있습니다.
# 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"]
제가 오류 메시지를 붙여넣었을 때 구글에서 처음 나온 결과인데, 제 주장이 어긋나서 그렇습니다.
컨테이너 이름은 모든 인수 뒤에 있어야 합니다.
나쁨:
docker run <container_name> -v $(pwd):/src -it
좋아요:
docker run -v $(pwd):/src -it <container_name>
하는 경우( 하는 exec 을 에 CMD ["grunt"]
, 큰 따옴표가 있는 JSON 배열), 셸 없이 실행됩니다.이는 대부분의 환경 변수가 존재하지 않음을 의미합니다.
로 하는 를 하는 를 로 :CMD grunt
) 입니다 은 뒤의 CMD
께될다다hdle 로 실행됩니다./bin/sh -c
.
이에 대한 자세한 내용은 도커 파일 참조의 CMD 섹션에서 확인할 수 있습니다.
저도 같은 문제를 발견했습니다.저는 다음과 같이 했습니다.
docker run -ti devops -v /tmp:/tmp /bin/bash
로 변경할 때
docker run -ti -v /tmp:/tmp devops /bin/bash
잘 작동합니다.
어떤 이유에서인지 "bash" clearifier를 추가하지 않으면 해당 오류가 발생합니다.엔트리포인트 파일 상단에 "#!/bin/bash"를 추가하는 것도 도움이 되지 않았습니다.
ENTRYPOINT [ "bash", "entrypoint.sh" ]
이와 같은 오류가 발생할 가능성이 있는 이유는 있습니다.
파일) 이었습니다.docker-entrypoint.sh
Ghost blog Dockerfile)에서 다운로드한 후 실행 파일 모드가 없습니다.
:chmod +x docker-entrypoint.sh
저도 같은 문제가 있었는데요, 구글 검색을 많이 해보니 어떻게 고쳐야 할지 모르겠어요.
갑자기 나의 바보같은 실수를 눈치챘습니다 :)
문서에 언급된 바와 같이, 마지막 부분은docker run
실행할 명령 및 컨테이너 로드 후 인수입니다.
컨테이너 이름이 아닙니다!!!
그것은 저의 당혹스러운 실수였습니다.
아래는 제가 무엇을 잘못했는지 확인하기 위해 제 명령 줄의 사진을 제공했습니다.
그리고 이것이 문서에 언급된 것과 같은 해결책입니다.
셸(예: 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
표시된 오류 메시지에서:
Error response from daemon: Cannot start container foo_1: \ exec: "grunt serve": executable file not found in $PATH
가능한 을 하고 을 grunt serve
파일을 수 . 을 은 은 을 grunt
…라는 serve
가장 높은 하는 것입니다 이 특정 오류에 대한 가장 가능성 높은 설명은 json 구문으로 명령을 실행하는 것입니다.
[ "grunt serve" ]
당신의 작곡 파일 같은 것에서.json 구문에서는 일반적으로 각 공간에서 셸에 의해 분할되는 각 매개 변수를 분할해야 하므로 이는 무효입니다.예:
[ "grunt", "serve" ]
두를 모두 수 의 로 은 이 의 에서 한다면입니다 을 로 의 를 한다면입니다 로 의 을 에서 의 이 docker run
예를 들어 명령어
docker run your_image_name "grunt serve"
이 경우 따옴표를 제거하여 run 명령에 별도의 arg로 전달해야 합니다.
docker run your_image_name grunt serve
이것을, ,executable file not found
Linux너을볼수을다는서다e을수sh로treexteeuogy볼nsx을너서는에서$PATH
가지 원인을 할 수 . 몇 입니다. 이는 여러 가지 가능한 원인을 의미할 수 있습니다. 여기 몇 가지가 있습니다.
이미지 안에 이진법을 넣은 것을 기억하십니까?다단계 이미지를 실행하는 경우 마지막 단계에서 이진 설치가 실행되는지 확인합니다.대화형 셸을 사용하여 이미지를 실행하고 이미지가 존재하는지 확인합니다.
docker run -it --rm your_image_name /bin/sh
컨테이너에 셸링할 때의 경로는 특히 bash를 사용하는 경우 대화형 셸을 위해 수정될 수 있으므로 컨테이너 내부의 이진 파일에 대한 전체 경로를 지정하거나 도커 파일의 경로를 다음과 같이 업데이트해야 할 수 있습니다.
ENV PATH=$PATH:/custom/dir/bin
바이너리에 실행 비트가 설정되어 있지 않을 수 있으므로 실행 가능하도록 만들어야 할 수도 있습니다.chmod로 수행합니다.
RUN chmod 755 /custom/dir/bin/executable
바이너리는 이미지 내부에 존재하지 않는 동적으로 연결된 라이브러리를 포함할 수 있습니다.능을 사용할 수 .
ldd
동적으로 연결된 라이브러리 목록을 봅니다.일반적인 이유는 glibc(대부분의 리눅스 환경)로 컴파일하고 musl(알파인 제공)로 실행하기 때문입니다.ldd /path/to/executable
볼륨을 사용하여 이미지를 실행하는 경우 해당 볼륨은 이미지에서 실행 파일이 있는 디렉터리를 오버레이할 수 있습니다.볼륨은 이미지와 병합되지 않으며 다른 Linux 파일 시스템 마운트와 동일하게 파일 시스템 트리에 마운트됩니다.즉, 마운트 지점에 있는 상위 파일 시스템의 파일이 더 이상 보이지 않습니다. (이름이 지정된 볼륨은 이미지 컨텐츠에서 도커로 초기화되지만, 이는 이름이 지정된 볼륨이 비어 있는 경우에만 발생합니다.)따라서 이미지에서 실행할 실행 파일이 있는 경로의 맨 위에 볼륨을 마운트하지 않는 것이 해결책입니다.
다른 플랫폼에 대해 바이너리를 실행하고 binfmt_misc를 구성하지 않은 경우
--fix-binary
옵션인 qemu는 호스트 파일 시스템 대신 컨테이너 파일 시스템 네임스페이스 내에서 인터프리터를 찾습니다.이 문제에 대한 자세한 내용은 이 Ubuntu 버그 보고서를 참조하십시오.오류가 셸 스크립트에서 발생한 경우 해당 스크립트의 첫 줄(예:
#!/bin/bash
위와 같은 이유로 이미지 내부에 명령어가 없거나 Linux 라인피드에서 파일이 asci 또는 utf8로 저장되지 않습니다.시도할 수 있습니다.dos2unix
라인 피드를 수정하거나 깃 및 편집기 설정을 확인할 수 있습니다.
나의 경우, 나는 이미지 이름 앞에 있는 모든 스위치를 잘못 이동 시켰습니다.
알파인 베이스 이미지를 작성할 때 다음 오류 메시지가 표시되었습니다.
ERROR: for web Cannot start service web: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "bash": executable file not found in $PATH: unknown
의 에docker-compose
file, bash와 bash를 사용하여 명령을 실행하는 명령 지시문은 알파인 베이스 이미지와 함께 제공되지 않습니다.
command: bash -c "python manage.py runserver 0.0.0.0:8000"
그 다음에 저는 명령을 실현하고 실행했습니다.sh
가 있었어요그것은 나에게 효과가 있었다.
문제는 glibc인데, 이것은 line base image의 일부가 아닙니다.
추가 후 효과 있음 :)
다음은 글리비씨를 얻는 단계입니다.
apk --no-cache add ca-certificates wget
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk
apk add glibc-2.28-r0.apk
를 사용하여 이 문제에 부딪혔습니다.docker-compose
. 여기 또는 이와 관련된 질문에 대한 어떤 해결책도 제 문제를 해결하지 못했습니다.궁극적으로 저에게 효과가 있었던 것은 모든 캐시된 도커 아티팩트를docker prune -a
도커를 다시 시작합니다.
제목을 참고해서.
제 실수는 변수를 다음과 같이 입력하는 것이었습니다.--env-file
docker run
. 다른 것들 중에서 그 파일은 a로 구성되어 있었습니다.PATH
명:PATH=$PATH:something
이 을 시켰습니다.PATH
var look like 글자 그대로PATH=$PATH:something
(다양한 해상도가 수행되지 않았음) 대신PATH:/usr/bin...:something
.
저는 그 해결책을 실행할 수 없었습니다.--env-file
, 제가 볼 수 있는 유일한 방법은ENV
도커 파일에 저장합니다.
작동하려면 /usr/bin에 소프트 참조를 추가합니다.
ln - s ($어떤 노드) /usr/bin/노드
ln -s ($npm) /usr/bin/npm
언급URL : https://stackoverflow.com/questions/27158840/docker-executable-file-not-found-in-path
'programing' 카테고리의 다른 글
MySQL - NULL safe not equal 연산자 (0) | 2023.09.11 |
---|---|
GCC: 배열 유형에 불완전한 요소 유형이 있습니다. (0) | 2023.09.11 |
NodeJS를 사용하여 CSV 파일 구문 분석 (0) | 2023.09.11 |
Node.js REPL에 있는 함수를 )(로 호출하는 이유는 무엇입니까? (0) | 2023.09.11 |
팬더는 서로 다른 열을 가진 두 개의 데이터 프레임을 병합합니다. (0) | 2023.09.11 |