Score:0

OWNER USER ผิดในโฟลเดอร์/ไฟล์: docker run -v :/ ไม่ทำงานสำหรับผู้ใช้ที่กำหนดใน Dockerfile

ธง in
AKS

ระบบปฏิบัติการโฮสต์: การเปิดตัว Red Hat Enterprise Linux Server 7.9 (ไมโป)

ระบบปฏิบัติการแขก เช่นคอนเทนเนอร์ Docker ที่ทำงาน: OpenSuse 15.2

เวอร์ชันนักเทียบท่า (บนโฮสต์): นักเทียบท่าเวอร์ชัน 19.03.5สร้าง 633a0ea

บนโฮสต์ เมื่อฉัน git โคลนที่เก็บ "utilities_scripts" ฉันมีสิทธิ์เข้าถึงที่ถูกต้องสำหรับผู้ใช้ (เนื่องจาก umask)

  • ฉันคิดว่าปัญหาที่นี่ไม่เกี่ยวข้องกับการอนุญาต แต่ทำไมผู้ใช้ที่กำหนดใน Dockerfile ไม่ได้รับการตั้งค่าให้เป็นเจ้าของโฟลเดอร์/ไฟล์ (ซึ่งกำลังเมานต์) ภายในคอนเทนเนอร์นักเทียบท่า เมื่อฉันออกสิ่งต่อไปนี้ นักเทียบท่ารัน ... สั่งการ. การตั้งค่า 755/775 ฯลฯ ไม่ใช่ตัวเลือกเนื่องจากฉันไม่สามารถ chown ภายในคอนเทนเนอร์ได้เนื่องจากผู้ใช้นักเทียบท่าเป้าหมายและการตั้งค่า 777 เป็นวิธีปฏิบัติที่ไม่ดี

บันทึก:

  1. เมื่อฉันลองใช้อิมเมจนักเทียบท่าเดียวกันจากเครื่อง Linux เครื่องอื่น โฟลเดอร์/ไฟล์จะถูกเมาท์เป็นผู้ใช้ "นักเทียบท่า_non_root_user" ซึ่งกำหนดไว้ใน Dockerfile เป็น USER นักเทียบท่า_non_root_user.
  2. สร้างนักเทียบท่า ... ทำงานสำเร็จและสร้างอิมเมจ และคอนเทนเนอร์ทำงานบนเครื่องอื่น (เมื่อฉันติดตั้ง git clone repos ภายในคอนเทนเนอร์โดยใช้ -v <โฮสต์>:<คอนเทนเนอร์> ไวยากรณ์ตัวเลือกนักเทียบท่า CLI

ข้อมูลโค้ด จาก Dockerfile คือ:

# กำหนดการอ้างอิงจุดเชื่อมต่อใด ๆ
ปริมาณ ["/home/docker_non_root_user/git"]

USER นักเทียบท่า_non_root_user
เวิร์กดีอาร์ /home/docker_non_root_user/git

นี่คือสิ่งที่ฉันเห็นบนโฮสต์ที่ฉันมี Dockerfile ผู้ใช้ ... ปัญหาความเป็นเจ้าของ:

[gigauser@jenkins-projectABC bitbucket_workspace]$ whoami
กิกะเซอร์
[gigauser@jenkins-projectABC bitbucket_workspace]รหัส $
uid=gigauser(gigauser) gid=21520(เจนกินส์) กลุ่ม=21520(เจนกินส์),3000(ectx)

[gigauser@jenkins-projectABC bitbucket_workspace]$ umask
0077
[gigauser@jenkins-projectABC bitbucket_workspace]$ ls -l
รวม 12
drwx------ 5 gigauser เจนกินส์ 4096 3 ก.พ. 16:36 utilities_scripts
[gigauser@jenkins-projectABC bitbucket_workspace]$


[gigauser@jenkins-projectABC bitbucket_workspace]$ รูปภาพ sudo docker ls
รหัสผ่านไดเรกทอรีที่ใช้งานอยู่:
รหัสภาพแท็กพื้นที่เก็บข้อมูลที่สร้างขนาด
project-im-opensuse 15.2 0c9ee31464cd 43 ชั่วโมงที่แล้ว 2.39GB
[gigauser@jenkins-projectABC bitbucket_workspace]$

[gigauser@jenkins-projectABC bitbucket_workspace]$
[gigauser@jenkins-projectABC bitbucket_workspace]$ sudo docker run -v $PWD/utilities_scripts:/home/docker_non_root_user/git/utilities_scripts/ -it project-im-opensuse:15.2 bash -c "whoami; id; which bash; bash - -version; ls -l; echo; ls -l utilities_scripts; ls -l /home/docker_non_root_user/git/utilities_scripts; id gigauser; echo"

คำเตือน: การส่งต่อ IPv4 ถูกปิดใช้งาน ระบบเครือข่ายจะไม่ทำงาน


นักเทียบท่า_non_root_user
uid=1000(docker_non_root_user) gid=487(docker_non_root_user) groups=487(docker_non_root_user),100(ผู้ใช้)

/ถัง/ทุบตี
GNU bash รุ่น 4.4.23(1)-release (x86_64-suse-linux-gnu)
ลิขสิทธิ์ (C) 2016 Free Software Foundation, Inc.
ใบอนุญาต GPLv3+: GNU GPL เวอร์ชัน 3 หรือใหม่กว่า <http://gnu.org/licenses/gpl.html>

นี่เป็นซอฟต์แวร์ฟรี คุณมีอิสระที่จะเปลี่ยนและแจกจ่ายซ้ำ
ไม่มีการรับประกันตามขอบเขตที่กฎหมายอนุญาต
รวม 8
drwx------ 5 gigauser 21520 4096 4 ก.พ. 00:36 utilities_scripts

ls: ไม่สามารถเปิดไดเรกทอรี 'utilities_scripts': ปฏิเสธการอนุญาต
ls: ไม่สามารถเปิดไดเรกทอรี '/home/docker_non_root_user/git/utilities_scripts': ปฏิเสธการอนุญาต
id: 'gigauser': ไม่มีผู้ใช้ดังกล่าว

[gigauser@jenkins-projectABC bitbucket_workspace]$

เมื่อฉันเรียกใช้คำสั่งเดียวกันบนเครื่อง Linux เครื่องอื่น ฉันเห็นการเมานท์ ยูทิลิตี้_สคริปต์ เจ้าของโฟลเดอร์คือ นักเทียบท่า_non_root_user.

คำถาม: ทำไม ฉันเห็น USER-ID ของผู้ใช้โฮสต์ (ที่ฉันใช้งานอยู่ เรียกใช้นักเทียบท่า คำสั่ง) กำลังได้รับการตั้งค่าภายในคอนเทนเนอร์นักเทียบท่าในโฟลเดอร์ ยูทิลิตี้_สคริปต์เมื่อไม่มีการสร้าง ID ผู้ใช้ดังกล่าวใน Dockerfile/มีอยู่ภายในคอนเทนเนอร์ (ดูบรรทัดสุดท้ายที่ 2 ในผลลัพธ์ด้านบนด้านบน) ขณะนี้ได้รับสิทธิ์เจ้าของโฮสต์และระดับโฟลเดอร์เดียวกันภายในคอนเทนเนอร์นักเทียบท่า

กิกะเซอร์ เช่น ผู้ใช้ของโฮสต์ ไม่มีอยู่ในคอนเทนเนอร์นักเทียบท่า แต่เป็นไฟล์ ls -l แสดงผลลัพธ์ กิกะเซอร์ เป็นเจ้าของ ยูทิลิตี้_สคริปต์ โฟลเดอร์/ไฟล์ในคอนเทนเนอร์ ปัญหานี้ไม่ได้เกิดขึ้นกับเครื่องโฮสต์อื่น

ฉันยังตรวจสอบ /etc/subuid ไฟล์ดูดีสำหรับฉัน การเปลี่ยนค่าภายในเป็นผู้ใช้นักเทียบท่าไม่ได้ช่วยอะไร นอกจากนี้ฉันไม่เห็นอะไรที่เกี่ยวข้องกับสิ่งนี้ใน /etc/docker/daemon.json ไฟล์.

$cat /etc/subuid
กิกะเซอร์:165536:65536

วิ่งเหมือนกัน นักเทียบท่าเรียกใช้ .... ตัวเลือก คำสั่งด้านบนจากเครื่องโฮสต์ Linux อื่น ๆ จะแสดงความเป็นเจ้าของโฟลเดอร์ภายในคอนเทนเนอร์นักเทียบท่าเป็น:

drwx------ 5 docker_non_root_user 1,000 272 26 ม.ค. 21:52 utilities_scripts
Score:0
ธง cn

ฉันไม่แน่ใจว่าฉันทำตามคำถามของคุณหรือไม่ เนื่องจากฉันไม่ชัดเจนเลยสักนิด แต่จากสิ่งที่ฉันเข้าใจ:

ของคุณ กิกะเซอร์ ID ตัวเลขไม่ได้ 1000ดูเหมือนว่ามันอาจจะเป็น 21520. มันทำงานบนโฮสต์อื่นเพราะที่นั่นผู้ใช้ในพื้นที่ของคุณอาจมีรหัสตัวเลข 1000.

คุณเห็น ID ผู้ใช้ของโฮสต์เนื่องจากคุณกำลังเมานต์โฟลเดอร์ ไม่ใช่การคัดลอก เมื่อคุณเมานต์ มันจะถูกแชร์ไปยังคอนเทนเนอร์โดยมีสิทธิ์/รหัสเดียวกันกับที่ตั้งค่าบนโฮสต์ - เพราะมันอยู่บนโฮสต์ คอนเทนเนอร์ไม่เหมือนกับ VM ที่มีทรัพยากรแยกกันโดยสิ้นเชิง และแม้แต่บน VM หากคุณติดตั้งบางอย่างเช่นไดเร็กทอรี NFS คุณจะได้รับ ID ตัวเลขที่อาจตรงกับหรือไม่ตรงกับ ID ในเครื่องของคุณ

โดยใช้ /etc/subuid ต้องส่งแฟล็กไปยังคำสั่งรัน และคุณจะต้องคำนวณหาค่าออฟเซ็ตสำหรับผู้ใช้ของคุณ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา