วิธีเพิ่มไฟล์ลงใน container docker ที่ไม่มีการอนุญาต root


16

ฉันกำลังพยายามเพิ่มไฟล์ลงในภาพ Docker ที่สร้างขึ้นจากtomcatภาพอย่างเป็นทางการ ภาพนั้นดูเหมือนว่าจะไม่มีสิทธิ์ในการใช้รูทเนื่องจากฉันลงชื่อเข้าใช้ในฐานะผู้ใช้tomcatถ้าฉันใช้ bash:

docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$ 

ถ้าผมสั่งDockerfileการคัดลอกไฟล์ไปยังภาชนะที่ไฟล์มีสิทธิ์และเป็นเจ้าของ644 rootเท่าที่ฉันเข้าใจดูเหมือนว่าจะสมเหตุสมผลเนื่องจากคำสั่งทั้งหมดใน Dockerfile นั้นทำงานเหมือนรูท อย่างไรก็ตามหากฉันพยายามเปลี่ยนความเป็นเจ้าของไฟล์tomcat:tomcatนั้นเป็นฉันได้รับOperation not permittedข้อผิดพลาด

ทำไมฉันไม่สามารถเปลี่ยนการอนุญาตของไฟล์ที่คัดลอกไปยังรูปภาพนั้นได้?

สามารถทำซ้ำได้อย่างไร:

mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile

docker build .

ผลลัพธ์ของdocker build .:

Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM tomcat
 ---> 44859847ef64
Step 1 : COPY test.txt /usr/local/tomcat/webapps/
 ---> Using cache
 ---> a2ccb92480a4
Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt
 ---> Running in 208e7ff0ec8f
chown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted
2014/11/01 00:30:33 The command [/bin/sh -c chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt] returned a non-zero code: 1

คำตอบ:


20

อาจเป็นไปได้ที่วิธีการดูและเปลี่ยน Dockerfile สำหรับ tomcat แต่ฉันไม่สามารถเข้าใจได้ในเวลาไม่กี่นาที โซลูชันที่ไม่เหมาะสมของฉันคือการเพิ่มบรรทัดนี้ก่อนที่จะ chown:

USER root

หากคุณต้องการยกระดับสิทธิ์หลังจาก (แนะนำให้ใช้) คุณสามารถเพิ่มบรรทัดนี้ได้:

USER tomcat

อีกทางเลือกหนึ่งทำงานกับอิมเมจที่ไม่ได้ติดตั้งซอฟต์แวร์เพื่อให้คุณสามารถเริ่ม Dockerfile ของคุณเป็นรูทและติดตั้ง tomcat และสิ่งอื่น ๆ จริงๆแล้วมันแปลกที่พวกเขาเปลี่ยนภาพลักษณ์จากประสบการณ์ของฉัน เหมาะสมที่จะอนุญาตให้ผู้ใช้ที่ตั้งใจตั้งค่าคำสั่ง USER ตามที่เห็นสมควร


มันใช้งานได้จริง! คุณรู้โดยบังเอิญว่าทำไมใส่และคัดลอกคำสั่งสร้างไฟล์กับเจ้าของroot? ทำไมพวกเขาไม่คำนึงถึงUSERคำสั่ง?
nyi

1
ปกติแล้วคุณจะไม่เห็นภาพพื้นฐานตั้งค่าคำสั่งเนื่องจากไม่มีวิธีที่จะรู้ได้ว่าบัญชีผู้ใช้ใดจะอยู่ในระบบ นอกจากนี้ยังอาจจะง่ายกว่าที่จะสร้างไฟล์เป็นรูทเนื่องจากเป็นสิ่งที่ Docker ต้องใช้งาน ดูเหมือนจะเป็นการร้องขอการปรับปรุงที่สมเหตุสมผลมันจะทำให้การสร้าง Dockerfiles ง่ายขึ้นหากสิ่งต่าง ๆ สามารถเป็นเจ้าของโดยอัตโนมัติโดยสิ่งที่ตั้งไว้ในคำสั่ง USER
theterribletrivium

ขอบคุณนำฉันออกจากความทุกข์ยากจริงๆ ฉันต้องการเพิ่มปุ่ม ssh ในภาพเจนกินส์
Kostas Demiris

8

เนื่องจาก Docker 17.09 สามารถใช้การ--chownตั้งค่าสถานะในการดำเนินการ ADD / COPY ใน Dockerfile เพื่อเปลี่ยนเจ้าของในขั้นตอน ADD / COPY แทนการดำเนินการ RUN แยกต่างหากด้วย chown ซึ่งจะเพิ่มขนาดของภาพตามที่คุณบันทึกไว้ มันจะเป็นการดีถ้ามีโหมดนี้เป็นโหมดเริ่มต้นนั่นคือการอนุญาตของผู้ใช้ในการคัดลอกไฟล์จะถูกนำไปใช้กับไฟล์ที่ถูกคัดลอก อย่างไรก็ตามทีมนักเทียบท่าไม่ต้องการทำลายความเข้ากันได้แบบย้อนหลังดังนั้นจึงแนะนำการตั้งค่าสถานะใหม่

COPY --chown=<user>:<group> <hostPath> <containerPath>

ทางเลือกอื่น ๆ คือ:

  1. เปลี่ยนสิทธิ์ในโฟลเดอร์การจัดเตรียมก่อนสร้างภาพ
  2. เรียกใช้คอนเทนเนอร์ผ่านสคริปต์ bootstrap ที่เปลี่ยนความเป็นเจ้าของ
  3. สควอชเลเยอร์!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.