Dockerfile에서 chown이 작동하지 않는 이유는 무엇입니까?


84

내 Dockerfile은 디렉터리를 생성하고 그 디렉터리를 선택한 다음 나중에 디렉터리를 나열합니다. 디렉토리는 여전히 루트 소유입니다. 왜 그런 겁니까?

다음은 Dockerfile입니다.

FROM ubuntu:precise
RUN useradd -d /home/testuser -m -s /bin/bash testuser
RUN mkdir -p /var/local/testrunner/logs
VOLUME ["/var/local/testrunner/logs"]
RUN grep testuser /etc/passwd
RUN grep root /etc/passwd
RUN chown -R testuser:testuser /var/local/testrunner/logs
RUN ls -ld /var/local/testrunner/logs 

다음은 "docker build"의 출력입니다.

Sending build context to Docker daemon 10.24 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:precise
 ---> ab8e2728644c
Step 1 : RUN useradd -d /home/testuser -m -s /bin/bash testuser
 ---> Using cache
 ---> 640f12671c86
Step 2 : RUN mkdir -p /var/local/testrunner/logs
 ---> Using cache
 ---> bf7756fd5b1f
Step 3 : VOLUME ["/var/local/testrunner/logs"]
 ---> Using cache
 ---> 65c73ee76c20
Step 4 : RUN grep testuser /etc/passwd
 ---> Using cache
 ---> db72fff0b965
Step 5 : RUN grep root /etc/passwd
 ---> Running in ebff78df7a9a
root:x:0:0:root:/root:/bin/bash
 ---> ead0ff704a59
Removing intermediate container ebff78df7a9a
Step 6 : RUN chown -R testuser:testuser /var/local/testrunner/logs
 ---> Running in c925f67b2ab4
 ---> 253132be935e
Removing intermediate container c925f67b2ab4
Step 7 : RUN ls -ld /var/local/testrunner/logs
 ---> Running in 978bc66aa47e
drwxr-xr-x 2 root staff 4096 Oct  1 15:15 /var/local/testrunner/logs

Docker 버전 1.2.0, 빌드 fa7b24f

호스트는 Ubuntu 12.04를 실행하지만 3.13.0-36 일반 커널을 사용합니다.


2
COPY 후 onership에 대한 문제는 다음을 참조하십시오. stackoverflow.com/questions/44766665/…
That Brazilian Guy

답변:


125

내 질문에 답하기 : 그것은 볼륨으로 선언되었습니다. VOLUME 명령을 꺼내면 chown이 적용됩니다.

또한 chown 실행 한 후 볼륨을 선언 하면 chown 설정이 그대로 유지됩니다.


17
"chown을 실행 한 후 볼륨을 선언하면 chown 설정이 그대로 유지됩니다."이것은 이틀 동안 저를 당황하게 한 것에 대한 대답입니다. 감사합니다!
CashIsClay

2
나 자신에게 대답하기 : 여기에있는 설명은 나에게 의미가 있었다 container-solutions.com/2014/12/understanding-volumes-docker
Michael Härtl

4
위의 그 기사에서 중요한 점 "[ VOLUME후 지정 RUN, 고정 표시기는 볼륨으로 마운트 볼륨 아래 이미지에 존재하는 모든 파일을 복사하고 올바르게 소유권을 설정하는 영리한 충분가 수정 볼륨이 것을 명령]. 이 원 볼륨에 대한 호스트 디렉토리를 지정하면 발생하지 않습니다 (호스트 파일을 실수로 덮어 쓰지 않도록). "
Gezim

2
@ MichaelHärtl에 의해 링크 된 설명에 대한 업데이트 된 URL : blog.container-solutions.com/understanding-volumes-docker
Kamafeather

4
내 dockerfile에 볼륨을 선언하지 않고 여전히이 문제가 있습니다 ... :-(
fccoelho

8

이 블로그 http://container42.com/2014/11/03/docker-indepth-volumes/에서는 이 동작에 대해 자세히 설명합니다.

Dockerfile의 각 명령어는 새 컨테이너를 만듭니다. 명령은이 컨테이너를 약간 변경하고 새 레이어가됩니다. VOLUME 명령이 실제 컨테이너 파일 시스템에 적용되기 전에 "/ var / local / testrunner / logs"가 변경되었습니다. 그러나 VOLUME 명령 이후 "/ var / local / testrunner / logs"디렉토리가 마운트 된 디렉토리입니다. VOLUME 명령 후이 디렉토리에 대한 변경 사항은 실제 컨테이너 파일 시스템이 아닌 마운트 된 디렉토리에 적용됩니다.


2

볼륨없이이 문제를 경험 한 사람 위해 복잡한 해결 방법을 찾았습니다.

문제:

다음과 같이 간단한 Dockerfile을 사용합니다.

FROM ubuntu:16.04
RUN useradd -m -d /home/new_user new_user
COPY test_file.txt /home/new_user
RUN chown -R new_user:new_user /home/new_user
CMD ls -RFlag /home

실행 후 :

echo "A file to test permissions." > test_file.txt
docker build -t chown-test -f Dockerfile .
docker run --rm -it chown-test

출력은 다음과 같습니다.

/home:
total 12
drwxr-xr-x 1 root 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:39 ../
drwxr-xr-x 1 root 4096 Jun 15 21:39 new_user/

/home/new_user:
total 24
drwxr-xr-x 1 root 4096 Jun 15 21:39 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
-rw-r--r-- 1 root  220 Aug 31  2015 .bash_logout
-rw-r--r-- 1 root 3771 Aug 31  2015 .bashrc
-rw-r--r-- 1 root  655 Jul 12  2019 .profile
-rw-r--r-- 1 root   28 Jun 11 19:48 test_file.txt

보시다시피 파일 소유권 (예 : test_file.txt)은 여전히 ​​user와 연결되어 있습니다 root.

해결책:

chown명령 에서 숫자 UID를 사용 하면 소유권을 변경할 수 있지만 UID가 1000이 아닌 경우에만 변경 될 수 있음을 발견했습니다 . 따라서의 UID에 1을 추가 new_user한 다음 소유권을 변경했습니다.

FROM ubuntu:16.04
RUN useradd -m -d /home/new_user new_user
# change the uid of new_user to ensure it has whatever it was assigned plus 1 (e.g. if UID was 1000, now it'll be 1001)
RUN id -u new_user | awk '{print $1+1}' | xargs -I{} usermod -u {} new_user
COPY test_file.txt /home/new_user
RUN id -u new_user | xargs -I{} chown -R {}:{} /home/new_user
CMD ls -RFlag /home

실행 후 :

echo "A file to test permissions." > test_file.txt
docker build -t chown-test -f Dockerfile .
docker run --rm -it chown-test

출력은 다음과 같습니다.

/home:
total 12
drwxr-xr-x 1 root 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
drwxr-xr-x 1 1001 4096 Jun 15 21:37 new_user/

/home/new_user:
total 24
drwxr-xr-x 1 1001 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
-rw-r--r-- 1 1001  220 Aug 31  2015 .bash_logout
-rw-r--r-- 1 1001 3771 Aug 31  2015 .bashrc
-rw-r--r-- 1 1001  655 Jul 12  2019 .profile
-rw-r--r-- 1 1001   28 Jun 11 19:48 test_file.txt

처음에이 문제가 발생한 이유를 잘 모르겠습니다. 그러나 다른 사람들에게이 문제가있는 것으로 보이므로 해결 방법을 게시 할 것이라고 생각했습니다. 내 사용 사례는 jupyter 노트북을 제공하는 도커 컨테이너를 만드는 것이 었습니다. 노트북을 제공하기 위해 루트가 아닌 사용자를 만들었습니다.


1

내 경험상 chown루트 ( VOLUME /test)에 마운트 할 때 작동하지 않습니다 . 루트가 아닌 위치 ( VOLUME /var/test)를 사용하십시오 .


0

들어 알파인 리눅스 사용자 , 내가해야 할 일을했을 chown -R root .내가 소유하려고했던 작업 공간에. 이것은 CMD볼륨 마운트가 마운트시 파일을 덮어 쓸 수 있다고 생각하기 때문에 dockerfile 에서 수행해야했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.