tại sao chown không hoạt động trong Dockerfile?


84

Dockerfile của tôi tạo một thư mục, cắt nhỏ nó rồi liệt kê thư mục sau đó. Thư mục vẫn thuộc sở hữu của người chủ. Tại sao vậy?

Đây là 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 

Đây là kết quả từ "bản dựng docker":

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 phiên bản 1.2.0, xây dựng fa7b24f

Máy chủ chạy Ubuntu 12.04, nhưng với một hạt nhân chung 3.13.0-36.


2
Đối với các vấn đề với onership sau khi SAO CHÉP, hãy xem: stackoverflow.com/questions/44766665/…
trai Brazil đó

Câu trả lời:


125

Trả lời câu hỏi của riêng tôi: nó được tuyên bố là một tập. Nếu bạn lấy ra lệnh VOLUME, chown có hiệu lực.

Hơn nữa, nếu bạn khai báo âm lượng sau khi chạy chown, cài đặt chown vẫn có hiệu lực.


17
"Nếu bạn khai báo âm lượng sau khi chạy chown, cài đặt chown vẫn có hiệu lực" Điều này vừa trả lời một điều khiến tôi bối rối trong hai ngày. Cảm ơn bạn!
CashIsClay

2
Tự trả lời: Lời giải thích ở đây có ý nghĩa đối với tôi container-solutions.com/2014/12/und
hieu-volumes-docker

4
Một điểm quan trọng từ bài viết mà trên: "[Khi VOLUMEđược xác định sau khi một RUNlệnh mà sửa đổi khối lượng], Docker là đủ thông minh để sao chép bất kỳ tập tin tồn tại trong hình ảnh dưới khối lượng gắn vào khối lượng và thiết lập quyền sở hữu một cách chính xác. Won này 'sẽ không xảy ra nếu bạn chỉ định thư mục máy chủ lưu trữ cho ổ đĩa (để các tệp máy chủ lưu trữ không vô tình bị ghi đè). "
Gezim 27/02/16

2
URL cập nhật để giải thích được liên kết bởi @ MichaelHärtl là: blog.container-solutions.com/und hieu
volumes

4
Tôi không khai báo bất kỳ VOLUME nào trên tệp dockerfile của mình và vẫn gặp sự cố này ... :-(
fccoelho

8

Blog này http://container42.com/2014/11/03/docker-indepth-volumes/ giải thích chi tiết hành vi này.

Mỗi lệnh trong Dockerfile tạo một vùng chứa mới. Lệnh thực hiện một số thay đổi đối với vùng chứa này và trở thành một lớp mới. Các thay đổi được thực hiện đối với "/ var / local / testrunner / logs" trước khi lệnh VOLUME được thực hiện cho hệ thống tệp vùng chứa thực tế. Tuy nhiên, sau chỉ dẫn VOLUME, thư mục "/ var / local / testrunner / logs" là thư mục được gắn kết. Những thay đổi được thực hiện đối với thư mục này sau lệnh VOLUME sẽ áp dụng trên thư mục được gắn kết chứ không phải hệ thống tệp vùng chứa thực tế.


2

Đối với bất kỳ ai gặp phải vấn đề này mà không có tập , tôi tìm thấy một công việc phức tạp xung quanh.

Vấn đề:

Với một Dockerfile đơn giản như sau:

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

Sau khi chạy:

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

Đầu ra là:

/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

Như bạn có thể thấy quyền sở hữu tệp (ví dụ: test_file.txt) vẫn được liên kết với người dùng root.

Giải pháp:

Tôi thấy rằng nếu tôi sử dụng UID dạng số trong chownlệnh, tôi có thể thay đổi quyền sở hữu, nhưng chỉ khi UID không phải là 1000. Vì vậy, tôi đã thêm 1 vào UID của new_uservà sau đó thay đổi quyền sở hữu.

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

Sau khi chạy:

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

Đầu ra là:

/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

Tôi không chắc tại sao tôi lại gặp vấn đề này ngay từ đầu. Tuy nhiên, vì có vẻ như những người khác đã gặp sự cố này, tôi nghĩ tôi sẽ đăng cách giải quyết khác của mình. Trường hợp sử dụng của tôi là tạo một bộ chứa docker phục vụ một sổ ghi chép jupyter. Tôi đã tạo một người dùng không phải root để cung cấp sổ ghi chép.


1

Theo kinh nghiệm của tôi, chownkhông hoạt động khi gắn vào root ( VOLUME /test). Sử dụng vị trí không phải gốc ( VOLUME /var/test).


0

Đối với người dùng Alpine Linux , tôi phải làm chown -R root .trong không gian làm việc mà tôi đang cố gắng sở hữu. Điều này phải được thực hiện trong CMDtệp dockerfile, vì tôi tin rằng ổ đĩa gắn kết có thể ghi đè tệp khi gắn kết

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.