Thông thường, các vấn đề về quyền với gắn kết âm lượng máy chủ là do uid / gid bên trong vùng chứa không có quyền truy cập vào tệp theo quyền uid / gid của tệp trên máy chủ. Tuy nhiên, trường hợp cụ thể này là khác nhau.
Dấu chấm ở cuối chuỗi cấp phép drwxr-xr-x.
, biểu thị SELinux được định cấu hình. Khi sử dụng giá treo máy chủ với SELinux, bạn cần chuyển một tùy chọn bổ sung cho đến cuối định nghĩa âm lượng:
- Các
z
tùy chọn chỉ ra rằng nội dung ràng buộc gắn kết được chia sẻ giữa nhiều vùng chứa.
- Các
Z
tùy chọn chỉ ra rằng nội dung ràng buộc gắn kết là tư nhân và chia sẻ.
Lệnh mount âm lượng của bạn sau đó sẽ trông như sau:
sudo docker run -i -v /data1/Downloads:/Downloads:z ubuntu bash
Xem thêm về việc gắn kết máy chủ với SELinux tại: https://docs.docker.com/st Storage / # configure-the-kindinux-label
Đối với những người khác thấy vấn đề này với các container đang chạy như một người dùng khác, bạn cần đảm bảo uid / gid của người dùng bên trong container có quyền đối với tệp trên máy chủ. Trên các máy chủ sản xuất, điều này thường được thực hiện bằng cách kiểm soát uid / gid trong quá trình xây dựng hình ảnh để khớp với uid / gid trên máy chủ có quyền truy cập vào các tệp (hoặc thậm chí tốt hơn, không sử dụng gắn kết máy chủ trong sản xuất).
Một ổ đĩa có tên thường được ưu tiên để gắn kết máy chủ bởi vì nó sẽ khởi tạo thư mục âm lượng từ thư mục hình ảnh, bao gồm mọi quyền sở hữu tệp và quyền. Điều này xảy ra khi âm lượng trống và container được tạo với âm lượng được đặt tên.
Người dùng MacOS hiện có OSXFS tự động xử lý uid / gid giữa máy chủ và bộ chứa Mac. Một nơi không giúp được là các tệp từ bên trong VM được nhúng vào thùng chứa, như /var/lib/docker.sock.
Đối với các môi trường phát triển nơi uid / gid của máy chủ có thể thay đổi theo từng nhà phát triển, giải pháp ưa thích của tôi là khởi động container với một điểm truy cập chạy bằng root, sửa uid / gid của người dùng bên trong container để khớp với khối lượng uid / gid của máy chủ và sau đó sử dụng gosu
để thả từ root đến người dùng container để chạy ứng dụng bên trong container. Kịch bản quan trọng cho điều này nằm fix-perms
trong tập lệnh hình ảnh cơ sở của tôi, có thể tìm thấy tại: https://github.com/sudo-bmitch/docker-base
Bit quan trọng từ fix-perms
kịch bản là:
# update the uid
if [ -n "$opt_u" ]; then
OLD_UID=$(getent passwd "${opt_u}" | cut -f3 -d:)
NEW_UID=$(stat -c "%u" "$1")
if [ "$OLD_UID" != "$NEW_UID" ]; then
echo "Changing UID of $opt_u from $OLD_UID to $NEW_UID"
usermod -u "$NEW_UID" -o "$opt_u"
if [ -n "$opt_r" ]; then
find / -xdev -user "$OLD_UID" -exec chown -h "$opt_u" {} \;
fi
fi
fi
Điều đó có được uid của người dùng bên trong container và uid của tệp và nếu chúng không khớp, hãy gọi usermod
để điều chỉnh uid. Cuối cùng, nó tìm thấy đệ quy để sửa bất kỳ tệp nào không thay đổi uid. Tôi thích điều này tốt hơn là chạy một thùng chứa có -u $(id -u):$(id -g)
cờ vì mã điểm nhập ở trên không yêu cầu mỗi nhà phát triển chạy tập lệnh để khởi động vùng chứa và bất kỳ tệp nào ngoài khối lượng mà người dùng sở hữu sẽ được sửa quyền.
Bạn cũng có thể yêu cầu docker khởi tạo thư mục máy chủ từ một hình ảnh bằng cách sử dụng một ổ đĩa có tên thực hiện gắn kết liên kết. Thư mục này phải tồn tại trước và bạn cần cung cấp một đường dẫn tuyệt đối đến thư mục máy chủ, không giống như khối lượng máy chủ trong một tệp soạn thảo có thể là các đường dẫn tương đối. Thư mục cũng phải trống để docker khởi tạo nó. Ba tùy chọn khác nhau để xác định âm lượng được đặt tên cho giá treo liên kết trông như sau:
# create the volume in advance
$ docker volume create --driver local \
--opt type=none \
--opt device=/home/user/test \
--opt o=bind \
test_vol
# create on the fly with --mount
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
foo
# inside a docker-compose file
...
volumes:
bind-test:
driver: local
driver_opts:
type: none
o: bind
device: /home/user/test
...
Cuối cùng, nếu bạn thử sử dụng không gian tên người dùng, bạn sẽ thấy rằng khối lượng máy chủ có vấn đề về quyền vì uid / gid của các container bị dịch chuyển. Trong kịch bản đó, có thể dễ dàng nhất để tránh khối lượng máy chủ và chỉ sử dụng khối lượng được đặt tên.