루트 권한이없는 도커 컨테이너에 파일을 추가하는 방법은 무엇입니까?


16

공식 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

답변:


20

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

USER root

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

USER tomcat

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


이것은 실제로 작동합니다! ADD 및 COPY 명령이 소유자로 파일을 작성하는 이유를 우연히 알고 root있습니까? 왜 그들은 USER지시문을 고려하지 않습니까?
nyi

1
글쎄, 일반적으로 시스템에 어떤 사용자 계정이 있는지 알 수있는 실제 방법이 없으므로 지시문을 설정하는 기본 이미지가 표시되지 않습니다. Docker가 실행해야하기 때문에 파일을 루트로 작성하는 것이 더 쉬울 수도 있습니다. 합리적인 향상 요청처럼 보이며 USER 지시문에 설정된 내용으로 물건을 자동으로 소유 할 수 있다면 Dockerfile 작성을 단순화합니다.
theterribletrivium

고마워, 정말 내 불행에서 벗어나게 해줘 Jenkins 이미지에 ssh 키를 추가해야했습니다.
코스타스 데미리스

8

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

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

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

  1. 이미지를 작성하기 전에 준비 폴더의 권한을 변경하십시오.
  2. 소유권을 변경하는 부트 스트랩 스크립트를 통해 컨테이너를 실행하십시오.
  3. 레이어 스쿼시!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.