Làm cách nào để thêm tệp vào bộ chứa docker không có quyền root?


16

Tôi đang cố gắng thêm một tệp vào hình ảnh Docker được xây dựng từ tomcathình ảnh chính thức . Hình ảnh đó dường như không có quyền root, vì tôi đã đăng nhập với tư cách người dùng tomcatnếu tôi chạy bash:

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

Nếu tôi hướng dẫn a Dockerfilesao chép một tệp vào vùng chứa đó, thì tệp đó có quyền 644và chủ sở hữu là root. Theo tôi hiểu, điều đó có vẻ hợp lý vì tất cả các lệnh trong Dockerfile đều được chạy dưới quyền root. Tuy nhiên, nếu tôi cố gắng thay đổi quyền sở hữu tệp đó thành tomcat:tomcat, tôi sẽ Operation not permittedgặp lỗi.

Tại sao tôi không thể thay đổi quyền của một tệp được sao chép vào hình ảnh đó?

Làm thế nào nó có thể được sao chép:

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 .

Đầu ra của 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

Câu trả lời:


20

Có thể có một cách để xem và thay đổi Dockerfile cho tomcat, nhưng tôi không thể tìm ra nó sau vài phút. Giải pháp không phù hợp của tôi là thêm dòng này trước khi chown:

USER root

Nếu bạn muốn nâng cao các đặc quyền sau (được khuyến nghị), bạn có thể thêm dòng này:

USER tomcat

Cách khác, làm việc với một hình ảnh chưa được cài đặt phần mềm để bạn có thể bắt đầu Dockerfile của mình với quyền root và cài đặt tomcat và tất cả những thứ đó. Thật kỳ lạ khi họ thay đổi điều đó trong hình ảnh của họ từ kinh nghiệm của tôi. Thật hợp lý khi cho phép người dùng cuối dự định đặt chỉ thị USER khi họ thấy phù hợp.


Điều này thực sự hoạt động! Bạn có biết tình cờ tại sao các lệnh ADD và COPY tạo tệp với chủ sở hữu rootkhông? Tại sao họ không xem xét USERchỉ thị?
nyi

1
Chà, thông thường, bạn không thấy hình ảnh cơ bản thiết lập chỉ thị, vì không có cách nào thực sự để biết tài khoản người dùng nào sẽ có trên hệ thống. Cũng có thể dễ dàng hơn khi chỉ cần tạo các tệp dưới dạng root vì đó là những gì Docker phải chạy. Có vẻ như là một yêu cầu nâng cao hợp lý, nó sẽ đơn giản hóa việc xây dựng Dockerfiles nếu mọi thứ có thể tự động được sở hữu bởi những gì được đặt trong chỉ thị USER.
theterribletrivium

Cảm ơn.Thực sự đưa tôi ra khỏi đau khổ của tôi. Tôi cần thêm các phím ssh trong ảnh Jenkins.
Kostas Demiris

8

Vì Docker 17,09, người ta có thể sử dụng --chowncờ trên các hoạt động ADD / COPY trong Dockerfile để thay đổi chủ sở hữu trong chính bước ADD / COPY thay vì thao tác RUN riêng với chown làm tăng kích thước của hình ảnh như bạn đã lưu ý. Sẽ tốt hơn nếu có chế độ này làm chế độ mặc định, tức là quyền của người dùng sao chép các tệp được áp dụng cho các tệp được sao chép. Tuy nhiên, nhóm Docker không muốn phá vỡ tính tương thích ngược và do đó đã giới thiệu một cờ mới.

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

Các lựa chọn thay thế khác là:

  1. Thay đổi quyền trong thư mục dàn trước khi xây dựng hình ảnh.
  2. Chạy container thông qua một kịch bản bootstrap thay đổi quyền sở hữu.
  3. Bóp các lớp!
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.