programing

도커: $PATH에서 실행 파일을 찾을 수 없습니다.

newstyles 2023. 9. 11. 21:32

도커: $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.shGhost blog Dockerfile)에서 다운로드한 후 실행 파일 모드가 없습니다.

:chmod +x docker-entrypoint.sh

저도 같은 문제가 있었는데요, 구글 검색을 많이 해보니 어떻게 고쳐야 할지 모르겠어요.

갑자기 나의 바보같은 실수를 눈치챘습니다 :)

문서에 언급된 바와 같이, 마지막 부분은docker run실행할 명령 및 컨테이너 로드 후 인수입니다.

컨테이너 이름이 아닙니다!!!

그것은 저의 당혹스러운 실수였습니다.

아래는 제가 무엇을 잘못했는지 확인하기 위해 제 명령 줄의 사진을 제공했습니다.

그리고 이것이 문서에 언급된 것과 같은 해결책입니다.

enter image description here

셸(예: 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-composefile, 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-filedocker run. 다른 것들 중에서 그 파일은 a로 구성되어 있었습니다.PATH명:PATH=$PATH:something이 을 시켰습니다.PATHvar 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