chmod ทำงานไม่ถูกต้องใน Docker


19

ฉันกำลังสร้างอิมเมจ Docker สำหรับSymfonyแอปของฉันและฉันต้องให้สิทธิ์เซิร์ฟเวอร์ apache เพื่อเขียนลงในแคชและโฟลเดอร์บันทึก

#Dockerfile
FROM php:7-apache

RUN apt-get update \
&& apt-get install -y libicu-dev  freetds-common freetds-bin unixodbc \
&& docker-php-ext-install intl mbstring \
&& a2enmod rewrite

COPY app/php.ini /usr/local/etc/php/
COPY app/apache2.conf /etc/apache2/apache2.conf
COPY ./ /var/www/html

RUN find /var/www/html/ -type d -exec chmod 755 {} \; 
RUN find /var/www/html/ -type f -exec chmod 644 {} \;
RUN chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

เมื่อผมสร้างภาพนี้กับและใช้ภาชนะที่มีdocker build -t myname/symfony_apps:latest . docker run -p 8080:80 myname/symfony_apps:latestบันทึก Apache ถูกน้ำท่วมโดยข้อผิดพลาดที่ได้รับอนุญาตถูกปฏิเสธสิ่งที่แปลกที่ฉันตรวจสอบด้วยls -aและสิทธิ์ใช้ได้ดี และเมื่อฉันรัน chmod จากการทุบตีของคอนเทนเนอร์ปัญหาการอนุญาต apache หายไปและแอปทำงานได้ดี

สถานการณ์

การรันคำสั่ง chmod จาก dockerfile: การอนุญาตมีการเปลี่ยนแปลง แต่ apache ยังคงบ่นเกี่ยวกับสิทธิ์ที่ถูกปฏิเสธ ใช้คำสั่ง chmod เดียวกันกับทุบตีในภาชนะ:สิทธิ์ถูกเปลี่ยนแปลงและแอพของฉันกำลังทำงาน

ความคิดใด ๆ ฉันมีบางสิ่งบางอย่างฉันควรเพิ่มผู้ใช้รูทใน Dockerfile หรือไม่?


มันจะเป็นประโยชน์ในการดูคำสั่งนักเทียบท่าของคุณที่รันอิมเมจที่สร้างขึ้น
Mike

ฉันเห็นพื้นที่พิเศษในคำสั่งสุดท้ายของคุณ (ฉันอยู่ในโทรศัพท์ของฉันดังนั้นฉันจึงไม่แน่ใจ) เนื่องจากปัญหาการอนุญาตดูเหมือนจะอยู่ในไดเรกทอรีบันทึกให้เปลี่ยนบรรทัดสุดท้ายเป็น: `` 'RUN chmod -R 777 / var / www / html / แอป / แคช / var / www / html / app / บันทึก `` `
ไมค์

1
โอเค .. ฉันแก้ไขคำถาม :)
พายุ

พื้นที่พิเศษนั้นเป็นตัวพิมพ์ผิด
พายุ

ฉันไม่สามารถทำซ้ำปัญหาของคุณ ถ้าฉันใช้ dockerfile ของคุณและตั้งค่าไฟล์จำลองบางตัวในเครื่องการอนุญาตนั้นถูกต้องและทุกอย่างก็ใช้ได้ ฉันสามารถบูทคอนเทนเนอร์และเข้าถึงเนื้อหาผ่านเว็บเบราว์เซอร์ คุณสามารถอัปเดตคำถามของคุณเพื่อรวมข้อความข้อผิดพลาดเฉพาะได้หรือไม่ คุณแน่ใจว่าการกำหนดค่า Apache ของคุณ ( apache2.conf) ไม่ก่อให้เกิดปัญหาหรือไม่ ข้อผิดพลาดจะหายไปหากคุณไม่ได้ติดตั้งapache2.conf?
larsks

คำตอบ:


16

ฉันมีปัญหาเดียวกันและดูเหมือนว่ามีข้อผิดพลาดบางอย่างในนักเทียบท่าหรือโอเวอร์เลย์ 2 หากเนื้อหาไดเรกทอรีถูกสร้างในชั้นหนึ่งและสิทธิ์ของมันมีการเปลี่ยนแปลงในอื่น ๆ

คุณสามารถคัดลอกแหล่งที่มาไปยังไดเรกทอรีชั่วคราว:

COPY . /src

จากนั้นย้ายไปยัง/var/www/htmlและตั้งค่าสิทธิ์ (ในRUNคำสั่งเดียว):

RUN rm -rf /var/www/html && mv /src /var/www/html &&\
    find /var/www/html/ -type d -exec chmod 755 {} \; &&\
    find /var/www/html/ -type f -exec chmod 644 {} \; &&\
    chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

นอกจากนี้ผมสร้างปัญหา GitHub


ฉันจะขุดลงในซอร์สโค้ดเก่าของฉันคืนนี้เพื่อดูว่าฉันแก้ปัญหานี้ได้อย่างไรจากนั้นฉันจำเคล็ดลับไดเรกทอรี tmp .. หวังว่านี่จะไม่ใช้เวลามากมายในการแก้ปัญหา XD
พายุ

7

เชลล์เริ่มต้นของ RUN ใน Docker คือ / bin / sh และนี่คือตำแหน่งที่การตั้งค่าการอนุญาตที่ไม่ถูกต้องมีปัญหาจริง

แต่คุณสามารถเปลี่ยนเป็นเพียงใช้ / bin / bash แทนเพื่อแก้ไขได้อย่างง่ายดายแจ้งให้ทราบก่อนและหลังรายการไดเรกทอรี

Step 7/9 : RUN /bin/bash -c 'ls -la; chmod +x gitlab-properties-builder.sh; ls -la'
---> Running in dc57ae77aa67

drwxr-xr-x. 3 root root      103 Mar  8 17:56 .
drwxr-xr-x. 1 root root       46 Mar  8 17:57 ..
drwxr-xr-x. 2 root root        6 Mar  7 20:47 config
-rw-r--r--. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh
-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar

drwxr-xr-x. 1 root root       42 Mar  8 17:56 .
drwxr-xr-x. 1 root root       61 Mar  8 17:57 ..
drwxr-xr-x. 2 root root        6 Mar  7 20:47 config
-rwxr-xr-x. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh
-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar
---> 8b5de6e348d3

2
ทำไม/bin/bash -c 'chmod +x file'จะทำงานและไม่ได้/bin/sh -c 'chmod +x file'?
พายุ

คุณเป็นทางออกที่ดีกว่า มันใช้งานได้สำหรับฉัน ขอบคุณ
user1427944

นอกจากนี้การใช้ buildkit ใหม่ช่วยในหลายพื้นที่รวมถึงอันนี้ ให้มันลอง. docs.docker.com/develop/develop-images/build_enhancements
Thad Guidry

6

ลองเพิ่ม:

USER root

มันใช้งานได้สำหรับฉัน


นี่ควรเป็นคำตอบที่ยอมรับได้
Vladimir Kornea

2
หากคุณเปลี่ยนเป็นรูทคุณควรเปลี่ยนกลับไปเป็นผู้ใช้ก่อนหน้าเมื่อคุณเสร็จสิ้นหรือคุณลดความปลอดภัยและความเข้ากันได้ของคอนเทนเนอร์ การติดตั้ง Kubernetes บางอย่างโดยค่าเริ่มต้นจะไม่เรียกใช้คอนเทนเนอร์ในฐานะรูทเช่น
flickerfly

2

ปัญหานี้น่าจะเป็นผลมาจากVOLUMEคำนิยามภายในไฟล์อัปสตรีม Dockerfile เมื่อมีการกำหนดระดับเสียงใน Dockerfile คุณสามารถเพิ่มไฟล์ด้วยคำสั่งCOPYหรือADDลงในภาพได้โดยตรง อย่างไรก็ตามRUNบรรทัดจะ:

  • สร้างคอนเทนเนอร์ชั่วคราวโดยใช้การกำหนดรูปภาพตามจุดปัจจุบันของ dockerfile
    • คอนเทนเนอร์ชั่วคราวนั้นจะมีวอลลุ่มไม่ระบุชื่อติดตั้งในขณะที่คุณหรืออิมเมจพาเรนต์ที่ระบุไว้ใน Dockerfile
    • ปริมาณที่ไม่ระบุชื่อจะถูกเริ่มต้นจากเนื้อหาของภาพ
  • คำสั่งของคุณจะทำงานภายในคอนเทนเนอร์
    • หากคุณแสดงรายการไดเรกทอรีระหว่างRUNคำสั่งนี้คุณจะเห็นการเปลี่ยนแปลงของคุณถูกนำไปใช้ แต่การเปลี่ยนแปลงเหล่านั้นถูกนำไปใช้กับไดรฟ์ข้อมูล
  • เมื่อคำสั่งเรียกใช้ของคุณเสร็จสมบูรณ์นักเทียบท่าจะจับการเปลี่ยนแปลงไปยังคอนเทนเนอร์
    • การเปลี่ยนแปลงเหล่านี้สามารถเห็นได้ด้วยdocker diffถ้าคุณไม่ได้ลบคอนเทนเนอร์ชั่วคราว (คุณสามารถเรียกใช้บิลด์ด้วย--rm=falseเพื่อให้พวกเขายังคงอยู่)
    • การเปลี่ยนแปลงเหล่านี้จะไม่รวมเนื้อหาปริมาณที่ไม่ระบุชื่อเพราะพวกเขาไม่ได้อยู่ในระบบไฟล์ภาชนะชั่วคราวปริมาณจะแยกจากกัน

เนื่องจากพฤติกรรมนี้คุณมีตัวเลือกดังนี้:

  1. คุณสามารถคัดลอกไฟล์ไปยังไดเรกทอรีอื่นและเปลี่ยนการอนุญาตที่นั่น
  2. คุณสามารถแก้ไขสิทธิ์บนโฮสต์ของคุณเพื่อให้พวกเขาได้รับการคัดลอกด้วยสิทธิ์เหล่านั้นโดยตรง
  3. คุณสามารถลบระดับเสียงจากภาพของคุณรับภาพต้นน้ำเพื่อลบคำจำกัดความเสียงของพวกเขาหรือคุณสามารถสร้างสำเนาภาพต้นน้ำของคุณเองโดยไม่ต้องกำหนดปริมาณและฐานภาพของคุณออกจากที่

โปรดทราบว่าภายในภาพ php ปัจจุบันดูเหมือนว่าไดรฟ์ข้อมูลถูกลบซึ่งหมายความว่าเรามีตัวเลือก 3 อย่างมีประสิทธิภาพ


0

ฉันเพิ่งทำการทดลองกับสิ่งต่อไปนี้:

FROM alpine

LABEL MAINTAINER="YIMGA YIMGA Salathiel Genèse"
RUN apk add --no-cache inotify-tools
CMD [ "./script.sh" ]
WORKDIR /opt/app/
COPY src/ /opt/app/
RUN chmod a+x *.sh

และมันก็ใช้งานได้ดี

อย่างไรก็ตาม

เมื่อฉันแทนที่ไฟล์ที่เรียกใช้งานได้ผ่านไดรฟ์ข้อมูลที่ประกอบด้วยนักเทียบท่าการexecuteอนุญาตนั้นเหมือนกับการย้อนกลับซึ่งเป็นการลบล้างสิทธิ์ทางเทคนิคดั้งเดิมของไฟล์

การแก้ไขสำหรับโหมด devนั้นทำได้ง่าย ๆchmod a+x yourfileจากโฮสต์ซึ่งจะได้รับการสืบทอดเมื่อประกอบการติดตั้งไดรฟ์ข้อมูล


1
เป้าหมายทั้งหมดของวอลลุ่มคือการเมานต์ไฟล์จากที่อื่นนอกเหนือจากภาพดังนั้นหากคุณแก้ไขภาพและเมานต์วอลลุ่มเหนือนั้นการออกแบบคุณจะไม่เห็นการเปลี่ยนแปลงภาพของคุณ คำตอบอาจจะไม่มีวอลลุ่มขึ้นอยู่กับสาเหตุที่คุณมีวอลลุ่ม
BMitch

ใช่BMitchฉันเห็นด้วยอย่างสิ้นเชิงกับผลกระทบของปริมาณการติดตั้งที่แทนที่คอนเทนเนอร์ fs จากอิมเมจที่สร้างขึ้นโดยนักเทียบท่า แต่ ... ในระหว่างการพัฒนาคุณไม่ต้องการสร้าง / รีสตาร์ทคอนเทนเนอร์ของคุณแน่นอนเพื่อทดสอบการเปลี่ยนแปลงทุกครั้ง ทำ. ในสถานการณ์หลังนี้คุณต้องการให้เมานต์วอลลุ่มที่แทนที่ภาพที่สร้างโดยนักเทียบท่า fs และฉันก็ประสบปัญหาเดียวกันก่อนลงจอดที่นี่ ฉันไม่ได้ถูกตัดสินด้วยคำตอบทั้งคำอธิบายและทดสอบแต่ละข้อ มันเป็นเพียงแล้วที่ฉันเข้าใจสิ่งที่มันเกิดขึ้นและโพสต์ข้อสังเกตของฉัน ...
Salathiel Genese

... และฉันสงสัยว่าสถานการณ์ที่ฉันพบนั้นเหมือนกับที่เขาถามคำถาม
Salathiel Genèse

OP ระบุว่าพวกเขาเห็นปัญหาด้วยเพียงdocker runคำสั่งและไม่มีการเมานต์เสียงภายนอก
BMitch

Oups - ฉันพลาดแง่มุมนั้น ... คำตอบที่ถูกต้องสำหรับชื่อคำถามที่ถูกต้อง แต่ไม่ใช่สถานการณ์จำลองที่อธิบายไว้ จากนั้นฉันขอพูดถึงว่าฉันไม่สามารถทำซ้ำปัญหาที่กล่าวถึงข้างต้นได้
Salathiel Genèse
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.