루트 권한이없는 도커 컨테이너에 파일을 추가하는 방법은 무엇입니까? 로그인했기 때문에 해당 이미지에 루트 권한이없는 것

공식 tomcat이미지 로 작성된 Docker 이미지에 파일을 추가하려고합니다 . tomcatbash를 실행하면 사용자로 로그인했기 때문에 해당 이미지에 루트 권한이없는 것 같습니다 .

docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$

Dockerfile파일을 해당 컨테이너에 복사 하도록 지시 하면 파일에 권한이 644있고 소유자는 root입니다. 내가 아는 한 Dockerfile의 모든 명령이 루트로 실행되는 것이 합리적입니다. 그러나 해당 파일의 소유권을로 변경하려고 tomcat:tomcat하면 Operation not permitted오류가 발생합니다.

해당 이미지로 복사 된 파일의 권한을 변경할 수없는 이유는 무엇입니까?

재현 방법 :

mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile

docker build .

의 출력 docker build .:

Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon
Step 0 : FROM tomcat
 ---> 44859847ef64
Step 1 : COPY test.txt /usr/local/tomcat/webapps/
 ---> Using cache
 ---> a2ccb92480a4
Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt
 ---> Running in 208e7ff0ec8f
chown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted
2014/11/01 00:30:33 The command [/bin/sh -c chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt] returned a non-zero code: 1


답변

바람둥이 용 Dockerfile을보고 변경하는 방법이있을 수 있지만 몇 분 후에 알아낼 수는 없습니다. 내 우아하지 않은 해결책은 chown 앞에이 줄을 추가하는 것입니다.

USER root

(권장) 이후에 권한을 높이려면 다음 줄을 추가하십시오.

USER tomcat

또는 소프트웨어가 설치되지 않은 이미지로 작업하여 Dockerfile을 루트로 시작하고 Tomcat을 설치하십시오. 실제로 내 경험에서 이미지로 변경되는 것이 이상합니다. 의도 한 최종 사용자가 USER 지시문을 적절하게 설정하도록 허용하는 것이 좋습니다.


답변

Docker 17.09부터 --chownDockerfile의 ADD / COPY 작업에 플래그를 사용하여 chown을 사용하는 별도의 RUN 작업 대신 ADD / COPY 단계 자체에서 소유자를 변경할 수 있습니다. 이것을 기본 모드로 사용하는 것이 좋을 것입니다. 즉 파일을 복사하는 사용자의 권한이 복사 된 파일에 적용됩니다. 그러나 Docker 팀은 이전 버전과의 호환성을 유지하고 싶지 않아 새로운 플래그를 도입했습니다.

COPY --chown=<user>:<group> <hostPath> <containerPath>

다른 대안은 다음과 같습니다.

  1. 이미지를 작성하기 전에 준비 폴더의 권한을 변경하십시오.
  2. 소유권을 변경하는 부트 스트랩 스크립트를 통해 컨테이너를 실행하십시오.
  3. 레이어 스쿼시!