โดยใช้ตัวเลือกบรรทัดคำสั่ง --uidmap
คุณสามารถระบุวิธีการ ผู้ใช้ของฉัน UID และ ผู้ใช้ของฉัน UID ย่อยจะถูกแมปลงในคอนเทนเนอร์
(ดูที่ หน้าคน สำหรับ พอดแมนวิ่ง
).
ตัวเลือกบรรทัดคำสั่ง --gidmap
ทำงานในลักษณะเดียวกัน แต่สำหรับ GID แทนที่จะเป็น UID
มาดู UID และ GID สำหรับผู้ใช้กัน จิงซ์ ในภาพคอนเทนเนอร์ docker.io/library/nginx
$ podman run --rm docker.io/library/nginx grep nginx /etc/passwd
nginx:x:101:101:ผู้ใช้ nginx,,,:/ไม่มีอยู่:/bin/false
$
ผลลัพธ์:
ตัวเลขนี้จะใช้ในภายหลังเมื่อตั้งค่าตัวแปรเชลล์สองตัว
$container_uid=101
$container_gid=101
(ตัวแปรเชลล์ ตู้คอนเทนเนอร์_uid และ ตู้คอนเทนเนอร์_gid ไม่มีความหมายใด ๆ นอกโพสต์นี้
เป็นเพียงการแนะนำเพื่อให้คำตอบอ่านง่ายขึ้น)
ลองดูในไฟล์ /etc/subuid และ /etc/subgid บนโฮสต์
ผู้ใช้งาน ผู้ใช้ของฉัน มี UID ย่อยและ GID ย่อยเหล่านี้
$ grep myuser /etc/subuid
myuser:231072:65536
$ grep myuser /etc/subgid
myuser:231072:65536
$
ผลลัพธ์:
ผู้ใช้ของฉัน มี UID ย่อย 65536 และ GID ย่อย 65536
ตัวเลขนี้จะใช้ในภายหลังเมื่อตั้งค่าตัวแปรเชลล์สองตัว
$subuid_size=65536
$subgid_size=65536
(ตัวแปรเชลล์ subuid_size และ subgid_size ไม่มีความหมายใด ๆ นอกโพสต์นี้
เป็นเพียงการแนะนำเพื่อให้คำตอบอ่านง่ายขึ้น)
แทนที่จะเงยหน้าขึ้นมอง subuid_size และ subgid_size ใน /etc/subuid และ /etc/subgidวิธีทั่วไปคือการเรียกใช้คำสั่ง
subuid_size=$(( $( ข้อมูล podman --format "{{ range .Host.IDMappings.UIDMap }}+{{.Size }}{{end }}" ) - 1 ))
subgid_size=$(( $( ข้อมูล podman --format "{{ range .Host.IDMappings.GIDMap }}+{{.Size }}{{end }}" ) - 1 ))
ข้อดีคือสิ่งนี้ยังใช้งานได้เมื่อไฟล์ /etc/nsswitch.conf จะใช้แทน /etc/subuid และ /etc/subgid. (ดู มนุษย์ย่อยยับ
)
การสาธิต 1: แผนที่ผู้ใช้ ผู้ใช้ของฉัน บนโฮสต์ไปยังผู้ใช้ ราก ภายในคอนเทนเนอร์
ไม่จำเป็นต้องระบุ --uidmap
ก็ไม่เช่นกัน --gidmap
เพราะนี่คือแผนที่มาตรฐาน
สร้างไดเร็กทอรีที่เขียนได้ทั่วโลก การสาธิต1
$ mkdir สาธิต1
$ chmod 777 สาธิต 1
$
สร้างไฟล์ใหม่ ทำงานเป็น ราก ภายในคอนเทนเนอร์:
$ พ็อดแมนรัน --rm \
-v ./demo1:/dir:Z \
docker.io/library/nginx สัมผัส /dir/created_by_root
$
สร้างไฟล์ใหม่ ทำงานเป็น จิงซ์ ภายในคอนเทนเนอร์:
$ พ็อดแมนรัน --rm \
--ผู้ใช้ 101:101 \
-v ./demo1:/dir:Z \
docker.io/library/nginx สัมผัส /dir/created_by_nginx
$
แสดงรายการไฟล์บนโฮสต์
$ ls -l สาธิต 1
รวม 0
-rw-r--r--. 1 231172 231172 0 27 ส.ค. 20:24 created_by_nginx
-rw-r--r--. 1 myuser myuser 0 ส.ค. 27 20:22 น. created_by_root
$
ผลลัพธ์: ไฟล์ created_by_root เป็นของ ผู้ใช้ของฉัน:ผู้ใช้ของฉัน
การสาธิต 2: แผนที่ผู้ใช้ ผู้ใช้ของฉัน บนโฮสต์ไปยังผู้ใช้ จิงซ์ ภายในคอนเทนเนอร์
สร้างไดเร็กทอรีที่เขียนได้ทั่วโลก การสาธิต2
$ mkdir สาธิต2
$ chmod 777 สาธิต 2
$
สร้างไฟล์ใหม่ ทำงานเป็น ราก ภายในคอนเทนเนอร์:
$subuid_size=65536
$subgid_size=65536
$container_uid=101
$container_gid=101
$ พ็อดแมนรัน --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 สัมผัส /dir/created_by_root
$
สร้างไฟล์ใหม่ ทำงานเป็น จิงซ์ ภายในคอนเทนเนอร์
$subuid_size=65536
$subgid_size=65536
$container_uid=101
$container_gid=101
$ พ็อดแมนรัน --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 สัมผัส /dir/created_by_nginx
$
แสดงรายการไฟล์บนโฮสต์
$ ls -l สาธิต 2
รวม 0
-rw-r--r--. 1 myuser myuser 0 ส.ค. 27 20:26 น. created_by_nginx
-rw-r--r--. 1 231072 231072 0 27 ส.ค. 20:25 created_by_root
$
ผลลัพธ์: ไฟล์ created_by_nginx เป็นของ ผู้ใช้ของฉัน:ผู้ใช้ของฉัน
บทสรุป
ใช้ --uidmap
และ --gidmap
ในลักษณะเดียวกับใน การสาธิต 2.
เคล็ดลับการแก้ปัญหา
ฉันเขียนเคล็ดลับการแก้ปัญหา:
ไม่สามารถเข้าถึงอุปกรณ์หรือไฟล์ที่ส่งผ่านในคอนเทนเนอร์ที่ไม่มีรูท (ปัญหาการแมป UID/GID) ที่มีวิธีการอธิบายไว้ใน การสาธิต 2