[bash] bash 스크립트를 실행하는 도커 진입 점이 “권한이 거부되었습니다”
내 node.js 앱을 Dockerize하려고합니다. 컨테이너가 빌드되면 a를 실행 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"]
내 docker-entrypoint.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.
컨테이너에 쉘을 넣고 docker-entrypoint.sh의 권한은 다음과 같습니다.
-rw-r--r-- 1 root root 292 Aug 10 18:41 docker-entrypoint.sh
세 가지 질문 :
-
내 bash 스크립트에 잘못된 구문이 있습니까?
-
이미지에 추가하기 전에 bash 파일의 권한을 어떻게 변경합니까?
-
bash 스크립트를 사용하지 않고 진입 점에서 여러 git 명령을 실행하는 가장 좋은 방법은 무엇입니까?
감사.
답변
-
“Permission denied”는 스크립트가 전혀 호출되지 않도록합니다 . 따라서, 가능하게 관련 될 수있는 유일한 구문은 처음과 같아야 라인 (이하 “오두막”)의 것입니다
#!/usr/bin/env bash
, 또는#!/bin/bash
, 또는 유사한 대상의 파일 시스템 레이아웃에 따라 달라집니다. -
실행을 허용하도록 설정되지 않은 파일 시스템 권한 일 가능성이 높습니다. shebang이 실행 가능하지 않은 것을 참조 할 수도 있지만 가능성 은 훨씬 적습니다.
-
이전 문제를 쉽게 수리 할 수 있다는 점에 의문을 제기합니다.
간단한 읽기
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"]
컨테이너 내에서이 문제를 해결합니다. 또는 Dockerfile에서 참조하는 로컬 사본이 실행 가능한지 확인한 다음 COPY
(메타 데이터를 유지하도록 명시 적으로 문서화되어 있음)을 사용할 수 있습니다.
답변
실행 파일을 실행하려면 실행 세트에 대한 권한이 있어야합니다.
도커 이미지 자체가 아닌 도커 이미지를 빌드하는 컴퓨터에서 다음을 실행 해보십시오.
ls -la path/to/directory
실행 파일에 대한 출력의 첫 번째 열 (이 경우 docker-entrypoint.sh)에는 다음과 같이 설정된 실행 비트가 있어야합니다.
-rwxrwxr-x
그렇지 않은 경우 다음을 시도하십시오.
chmod +x docker-entrypoint.sh
그런 다음 도커 이미지를 다시 빌드하십시오.
Docker는 자체 파일 시스템을 사용하지만 소스 디렉토리에서 모든 것을 복사합니다 (권한 비트 포함).
답변
나는 같은 문제에 직면했고
ENTRYPOINT ["sh", "/docker-entrypoint.sh"]
원래 질문의 Dockerfile의 경우 다음과 같아야합니다.
ENTRYPOINT ["sh", "/usr/src/app/docker-entrypoint.sh"]
답변
DockerFile을 사용 하지 않는 경우 간단히 bash의 명령 줄 인수로 권한을 추가 할 수 있습니다.
docker run -t <image> /bin/bash -c "chmod +x /usr/src/app/docker-entrypoint.sh; /usr/src/app/docker-entrypoint.sh"
답변
이것은 내 답변 2 년 전에 묻는 오래된 질문입니다. 어쨌든 저에게 도움이 된 것을 게시 할 것입니다.
내 작업 디렉토리에는 Dockerfile 및 provision.sh라는 두 개의 파일이 있습니다.
Dockerfile :
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"]
provision.sh :
#!/usr/bin/env bash
yum upgrade
컨테이너 외부의 파일을 실행 파일로 설정 chmod 700 provision.sh
한 다음 실행 하여 도커 컨테이너의 파일을 실행 가능하게 만들 수있었습니다 docker build .
.