programing

bash 스크립트를 실행하는 도커 진입점이 "권한 거부"를 수신함

closeapi 2023. 5. 16. 22:40
반응형

bash 스크립트를 실행하는 도커 진입점이 "권한 거부"를 수신함

app.node.js 파일을 컨테이너가 만들어지면, 저는 컨테이너가 실행되기를 원합니다.git clone노드 서버를 시작합니다.따라서 이러한 작업을 .sh 스크립트에 넣습니다.ENTRYPOINT에서 합니다.

FROM ubuntu:14.04

RUN apt-get update && apt-get install -y build-essential libssl-dev gcc curl npm git

#install gcc 4.9
RUN apt-get install -y software-properties-common python-software-properties
RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
RUN apt-get update
RUN apt-get install -y libstdc++-4.9-dev

#install newst nodejs
RUN curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
RUN apt-get install -y nodejs

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ADD package.json /usr/src/app/
RUN npm install

ADD docker-entrypoint.sh /usr/src/app/

EXPOSE 8080

ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"] 

나의 도커 진입점.sh는 다음과 같이 보입니다.

git clone git@<repo>.git
git add remote upstream git@<upstream_repo>.git

/usr/bin/node server.js

이 이미지를 빌드하고 실행한 후:

docker run --env NODE_ENV=development -p 8080:8080 -t -i <image>

다음과 같은 정보:

docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.

나는 컨테이너에 포격을 가하고 도커 진입점의 허가를 받습니다.쉬:

-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh

세 가지 질문:

  1. 내 bash 스크립트의 구문이 잘못되었습니까?

  2. 이미지에 추가하기 전에 bash 파일의 사용 권한을 변경하려면 어떻게 해야 합니까?

  3. bash 스크립트를 사용하지 않고 진입점에서 여러 git 명령을 실행하는 가장 좋은 방법은 무엇입니까?

감사해요.

  1. "권한 거부"는 스크립트가 전혀 호출되지 않도록 합니다.따라서, 관련될 수 있는 유일한 구문은 다음과 같이 보여야 하는 첫 번째 줄("쉐방")의 구문입니다.#!/usr/bin/env bash또는#!/bin/bash또는 대상의 파일 시스템 레이아웃에 따라 유사합니다.

  2. 파일 시스템 권한이 실행을 허용하도록 설정되지 않았을 가능성이 높습니다.셰방이 실행 불가능한 것을 참조할 수도 있지만, 이는 훨씬 덜 가능합니다.

  3. 이전 문제를 쉽게 복구할 수 있습니다.


의 단순한 해석.

docker: Error response from daemon: oci runtime error: exec: "/usr/src/app/docker-entrypoint.sh": permission denied.

...스크립트가 실행 가능한 것으로 표시되지 않습니다.

RUN ["chmod", "+x", "/usr/src/app/docker-entrypoint.sh"]

컨테이너 내에서 이 문제를 해결합니다.또는 Docker 파일에서 참조하는 로컬 복사본이 실행 가능한지 확인한 다음COPY(메타데이터를 보관하도록 명시적으로 문서화됨).

실행 파일을 실행하려면 실행 파일에 실행 권한이 설정되어 있어야 합니다.

도커 이미지를 빌드하는 컴퓨터에서(도커 이미지 자체 내부가 아님) 다음을 실행해 보십시오.

ls -la path/to/directory

실행 파일(이 경우 도커 진입점)에 대한 출력의 첫 번째 열입니다.sh) 실행 가능한 비트를 다음과 같이 설정해야 합니다.

-rwxrwxr-x

그렇지 않은 경우 다음을 시도:

chmod +x docker-entrypoint.sh

도커 이미지를 다시 빌드합니다.

Docker는 자체 파일 시스템을 사용하지만 원본 디렉터리에서 모든 것(권한 비트 포함)을 복사합니다.

나는 같은 문제에 직면했고 그것은 다음에 의해 해결되었습니다.

ENTRYPOINT ["sh", "/docker-entrypoint.sh"]

원래 질문의 도커 파일의 경우 다음과 같아야 합니다.

ENTRYPOINT ["sh", "/usr/src/app/docker-entrypoint.sh"]

문제는 원래 파일에 실행 권한이 없기 때문입니다.

원본 파일에 권한이 있는지 확인합니다.

달려.ls -al

결과가 나오면,-rw-r--r--,

달려.
chmod +x docker-entrypoint.sh

도커 제작 전!

점 [ ] 제거

이 문제는 3시간 이상 걸려 결국 끝에서 점을 제거하는 것이 문제였습니다.

문제는

docker run  -p 3000:80 --rm --name test-con test-app .

/usr/local/bin/coper-entrypoint입니다.sh: 8: exec: .: 권한이 거부되었습니다.

명령줄 끝에서 점을 제거하기만 하면 됩니다.

docker run  -p 3000:80 --rm --name test-con test-app 

파일에 실행 권한 부여docker-entrypoint.sh

sudo chmod 775 docker-entrypoint.sh

이것은 약간 바보 같은 것일 수도 있지만, 제가 받은 오류 메시지는 Permission denied였고 그것은 그것을 해결하기 위해 저를 매우 잘못된 방향으로 밀어내리게 했습니다. (예를 들어 여기에)

제가 직접 bash 스크립트를 추가하지도 않았는데, 제가 사용하는 nodejs 이미지로 하나가 추가된 것 같습니다.

FROM node:14.9.0

로컬에서 포트를 노출/연결하기 위해 잘못 실행했습니다.

docker run -p 80:80 [name] . # this is wrong!

이는

/usr/local/bin/docker-entrypoint.sh: 8: exec: .: Permission denied

하지만 마지막에 점이 있으면 안 됩니다. 실수로 다른 프로젝트 도커 이미지의 문서화에 추가되었습니다.실행하기만 하면 됩니다.

docker run -p 80:80 [name]

저는 도커를 많이 좋아하지만 이런 고택이 너무 많고 항상 명확한 오류 메시지가 있는 것은 아닙니다.

DockerFile을 사용하지 않는 경우 권한을 bash의 명령줄 인수로 추가하기만 하면 됩니다.

docker run -t <image>  /bin/bash -c "chmod +x /usr/src/app/docker-entrypoint.sh; /usr/src/app/docker-entrypoint.sh"

이것은 제가 답변하기 2년 전에 했던 오래된 질문입니다. 저는 어쨌든 저에게 효과가 있었던 것을 게시할 것입니다.

내 작업 디렉토리에는 두 개의 파일이 있습니다.도커 파일 및 프로비저닝.

도커 파일:

FROM centos:6.8

# put the script in the /root directory of the container
COPY provision.sh /root

# execute the script inside the container
RUN /root/provision.sh

EXPOSE 80

# Default command
CMD ["/bin/bash"]

공급.sh:

#!/usr/bin/env bash

yum upgrade

컨테이너 외부의 파일을 실행 파일로 설정하여 도커 컨테이너의 파일을 실행 파일로 만들 수 있었습니다.chmod 700 provision.sh당시의docker build ..

만약 당신이 여전히Permission denied도커의 진입점에서 스크립트를 실행하려고 할 때는 진입점의 셸 형식을 사용하지 마십시오.

다음 대신:ENTRYPOINT ./bin/watcher글을 쓰다ENTRYPOINT ["./bin/watcher"]:

https://docs.docker.com/engine/reference/builder/ # 진입점

여기에 이미지 설명 입력

저도 같은 문제에 직면했습니다.이것은 나에게 효과가 있습니다.

COPY ./entrypoint.sh /entrypoint
RUN sed -i 's/\r//' /entrypoint
RUN chmod +x /entrypoint

ENTRYPOINT ["/entrypoint"]

언급URL : https://stackoverflow.com/questions/38882654/docker-entrypoint-running-bash-script-gets-permission-denied

반응형