Bằng cách sử dụng tùy chọn dòng lệnh --uidmap
bạn có thể chỉ định cách người dùng của tôi UID và người dùng của tôi UID phụ được ánh xạ vào vùng chứa.
(Xem trang người đàn ông vì chạy bộ
).
Tùy chọn dòng lệnh --gidmap
hoạt động theo cách tương tự nhưng đối với GID thay vì UID.
Hãy tra cứu UID và GID của người dùng nginx trong hình ảnh vùng chứa docker.io/library/nginx
$ podman chạy --rm docker.io/library/nginx grep nginx /etc/passwd
nginx:x:101:101:người dùng nginx,,,:/không tồn tại:/bin/false
$
Kết quả:
Các số sau này được sử dụng khi đặt hai biến trình bao
$ container_uid=101
$ container_gid=101
(Các biến shell container_uid và container_gid không có bất kỳ ý nghĩa bên ngoài bài viết này.
Chúng chỉ được giới thiệu để làm cho câu trả lời dễ đọc hơn)
Hãy xem các tệp /etc/subuid và /etc/subgid trên máy chủ
Người dùng người dùng của tôi có các UID phụ và GID phụ này.
$ grep myuser /etc/subuid
người dùng của tôi:231072:65536
$ grep myuser /etc/subgid
người dùng của tôi:231072:65536
$
Kết quả:
người dùng của tôi có 65536 UID phụ và 65536 GID phụ.
Các số sau này được sử dụng khi đặt hai biến trình bao
$ subuid_size=65536
$ subgid_size=65536
(Các biến shell subuid_size và subgid_size không có bất kỳ ý nghĩa bên ngoài bài viết này.
Chúng chỉ được giới thiệu để làm cho câu trả lời dễ đọc hơn)
Thay vì nhìn lên subuid_size và subgid_size Trong /etc/subuid và /etc/subgid, một phương pháp tổng quát hơn là chạy các lệnh
subuid_size=$(( $(podman info --format "{{ range .Host.IDMappings.UIDMap }}+{{.Size }}{{end }}" ) - 1 ))
subgid_size=$(( $(podman info --format "{{ range .Host.IDMappings.GIDMap }}+{{.Size }}{{end }}" ) - 1 ))
Ưu điểm là điều này cũng hoạt động khi tệp /etc/nsswitch.conf được sử dụng thay vì /etc/subuid và /etc/subgid. (Nhìn thấy người đàn ông phụ
)
Bản trình diễn 1: ánh xạ người dùng người dùng của tôi trên máy chủ cho người dùng nguồn gốc bên trong thùng chứa
Không cần chỉ định --uidmap
cũng không --gidmap
bởi vì đây là ánh xạ tiêu chuẩn.
Tạo thư mục có thể ghi trên thế giới bản demo1
$ mkdir demo1
$ chmod 777 demo1
$
Tạo một tệp mới, chạy dưới dạng nguồn gốc bên trong thùng chứa:
$ podman chạy --rm \
-v ./demo1:/dir:Z \
docker.io/library/nginx touch /dir/created_by_root
$
Tạo một tệp mới, chạy dưới dạng nginx bên trong thùng chứa:
$ podman chạy --rm \
--người dùng 101:101 \
-v ./demo1:/dir:Z \
docker.io/library/nginx touch /dir/created_by_nginx
$
Liệt kê các tập tin trên máy chủ
$ ls -l demo1
tổng số 0
-rw-r--r--. 1 231172 231172 0 27 tháng 8 20:24 created_by_nginx
-rw-r--r--. 1 myuser myuser 0 27 tháng 8 20:22 created_by_root
$
Kết quả: Tệp created_by_root được sở hữu bởi người dùng của tôi:người dùng của tôi
Bản trình diễn 2: ánh xạ người dùng người dùng của tôi trên máy chủ cho người dùng nginx bên trong thùng chứa
Tạo thư mục có thể ghi trên thế giới demo2
$ mkdir demo2
$ chmod 777 demo2
$
Tạo một tệp mới, chạy dưới dạng nguồn gốc bên trong thùng chứa:
$ subuid_size=65536
$ subgid_size=65536
$ container_uid=101
$ container_gid=101
$ podman chạy --rm \
--uidmap=0:1:$container_uid \
--uidmap=$((container_uid + 1)):$((container_uid + 1)):$((subuid_size - $container_uid)) \
--uidmap=$container_uid:0:1 \
--gidmap=0:1:$container_gid \
--gidmap=$((container_gid + 1)):$((container_gid + 1)):$((subgid_size - $container_gid)) \
--gidmap=$container_gid:0:1 \
-v ./demo2:/dir:Z \
docker.io/library/nginx touch /dir/created_by_root
$
Tạo một tệp mới, chạy dưới dạng nginx bên trong thùng chứa.
$ subuid_size=65536
$ subgid_size=65536
$ container_uid=101
$ container_gid=101
$ podman chạy --rm \
--user $container_uid:$container_gid \
--uidmap=0:1:$container_uid \
--uidmap=$((container_uid + 1)):$((container_uid + 1)):$((subuid_size - $container_uid)) \
--uidmap=$container_uid:0:1 \
--gidmap=0:1:$container_gid \
--gidmap=$((container_gid + 1)):$((container_gid + 1)):$((subgid_size - $container_gid)) \
--gidmap=$container_gid:0:1 \
-v ./demo2:/dir:Z \
docker.io/library/nginx touch /dir/created_by_nginx
$
Liệt kê các tập tin trên máy chủ
$ ls -l demo2
tổng số 0
-rw-r--r--. 1 myuser myuser 0 27 tháng 8 20:26 created_by_nginx
-rw-r--r--. 1 231072 231072 0 ngày 27 tháng 8 20:25 created_by_root
$
Kết quả: Tệp created_by_nginx được sở hữu bởi người dùng của tôi:người dùng của tôi
Phần kết luận
Sử dụng --uidmap
và --gidmap
theo cách tương tự như trong Bản trình diễn 2.
mẹo khắc phục sự cố
Tôi đã viết một mẹo khắc phục sự cố:
Không thể truy cập các thiết bị hoặc tệp được truyền vào trong vùng chứa không root (sự cố ánh xạ UID/GID) có chứa phương pháp được mô tả trong Bản trình diễn 2