ในนักเทียบท่าไฟล์ที่สร้างขึ้นภายในคอนเทนเนอร์มักจะมีความเป็นเจ้าของที่ไม่สามารถคาดเดาได้ในขณะที่ตรวจสอบไฟล์เหล่านั้นจากโฮสต์ เจ้าของไฟล์บนไดรฟ์ข้อมูลคือ root (uid 0) โดยค่าเริ่มต้น แต่ทันทีที่บัญชีผู้ใช้ที่ไม่ใช่รูทเกี่ยวข้องกับคอนเทนเนอร์และเขียนไปยังระบบไฟล์เจ้าของจะสุ่มจากมุมมองของโฮสต์มากขึ้นหรือน้อยลง
เป็นปัญหาเมื่อคุณต้องการเข้าถึงข้อมูลปริมาณจากโฮสต์โดยใช้บัญชีผู้ใช้เดียวกันซึ่งเรียกใช้คำสั่งนักเทียบท่า
วิธีแก้ปัญหาทั่วไปคือ
- บังคับให้ผู้ใช้ uIDs ในเวลาสร้างใน Dockerfiles (ไม่ใช่แบบพกพา)
- ส่งผ่าน UID ของผู้ใช้โฮสต์ไปยัง
docker run
คำสั่งเป็นตัวแปรสภาพแวดล้อมจากนั้นรันchown
คำสั่งบางคำบนไดรฟ์ข้อมูลในสคริปต์จุดเริ่มต้น
โซลูชันทั้งสองนี้สามารถควบคุมสิทธิ์จริงภายนอกคอนเทนเนอร์ได้
ฉันคาดว่าเนมสเปซของผู้ใช้จะเป็นทางออกสุดท้ายสำหรับปัญหานี้ ฉันได้ทำการทดสอบกับเวอร์ชัน 1.10 ที่เพิ่งเปิดตัวและ - ผู้ใช้ - ทำการรีแมปไปยังบัญชีเดสก์ท็อปของฉัน อย่างไรก็ตามฉันไม่แน่ใจว่ามันสามารถทำให้การเป็นเจ้าของไฟล์บนไดรฟ์ข้อมูลที่เมาท์จัดการง่ายขึ้นฉันกลัวว่ามันอาจจะตรงกันข้าม
สมมติว่าฉันเริ่มคอนเทนเนอร์พื้นฐานนี้
docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit
จากนั้นตรวจสอบเนื้อหาจากโฮสต์:
ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/
-rw-r--r-- 1 100000 100000 6 Feb 8 19:43 test.txt
หมายเลข '100000' นี้เป็น UID ย่อยของผู้ใช้โฮสต์ของฉัน แต่เนื่องจากไม่ตรงกับ UID ของผู้ใช้ของฉันฉันจึงยังไม่สามารถแก้ไข test.txt ได้หากไม่มีสิทธิ์ ผู้ใช้ย่อยรายนี้ดูเหมือนจะไม่มีความสัมพันธ์ใด ๆ กับผู้ใช้ปกติของฉันนอกนักเทียบท่า มันไม่ถูกแมปกลับ
วิธีแก้ปัญหาที่กล่าวถึงก่อนหน้านี้ในโพสต์นี้ซึ่งประกอบด้วยการจัดแนว UID ระหว่างโฮสต์และคอนเทนเนอร์ไม่ทำงานอีกต่อไปเนื่องจากการUID->sub-UID
แมปที่เกิดขึ้นในเนมสเปซ
จากนั้นมีวิธีเรียกใช้นักเทียบท่าโดยเปิดใช้งานเนมสเปซผู้ใช้ (เพื่อความปลอดภัยที่ดีขึ้น) ในขณะที่ยังทำให้ผู้ใช้โฮสต์ที่เรียกใช้นักเทียบท่าสามารถเป็นเจ้าของไฟล์ที่สร้างจากไดรฟ์ข้อมูลได้หรือไม่