[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

세 가지 질문 :

  1. 내 bash 스크립트에 잘못된 구문이 있습니까?

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

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

감사.



답변

  1. “Permission denied”는 스크립트가 전혀 호출되지 않도록합니다 . 따라서, 가능하게 관련 될 수있는 유일한 구문은 처음과 같아야 라인 (이하 “오두막”)의 것입니다 #!/usr/bin/env bash, 또는 #!/bin/bash, 또는 유사한 대상의 파일 시스템 레이아웃에 따라 달라집니다.

  2. 실행을 허용하도록 설정되지 않은 파일 시스템 권한 일 가능성이 높습니다. shebang이 실행 가능하지 않은 것을 참조 할 수도 있지만 가능성 은 훨씬 적습니다.

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

컨테이너 내에서이 문제를 해결합니다. 또는 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 ..


답변