डॉकटर में सही तरीके से काम नहीं कर रहा है


19

मैं अपने Symfonyऐप के लिए डॉकर इमेज बना रहा हूं और मुझे कैश और लॉग फोल्डर में अपाचे सर्वर को अनुमति देने की आवश्यकता है

#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। अपाचे लॉग अनुमति अस्वीकृत त्रुटियों से भर गया है, जिस अजीब चीज के साथ मैंने जांच की है ls -aऔर अनुमतियाँ ठीक हैं। और जब मैं कंटेनर की बाश से चामोद चलाता हूं, तो अपाचे अनुमति मुद्दे चले जाते हैं और ऐप अच्छी तरह से काम करता है

स्थिति

Dockerfile से chmod कमांड चलाना: अनुमतियां बदली जाती हैं, लेकिन अपाचे अभी भी अनुमति से वंचित होने की शिकायत करता है। कंटेनर के अंदर bash के साथ chmod समान कमांड चलाना: अनुमतियां बदली जाती हैं और मेरा ऐप चल रहा है

कोई भी विचार, क्या मुझे कुछ याद आ रहा है, शायद मुझे डॉकरीफाइल में कहीं रूट उपयोगकर्ता जोड़ना चाहिए?


यह आपके डॉक कमांड को देखने में मददगार होगा जो बिल्ट इमेज चलाता है।
माइक

मैं आपकी अंतिम कमांड में एक अतिरिक्त स्थान देख रहा हूं (मैं अपने फोन पर हूं, इसलिए मुझे यकीन नहीं हो सकता है)। जैसा कि अनुमति समस्या लॉग डायरेक्टरी के साथ लगती है, अंतिम पंक्ति को इसमें बदल दें: `` RUN chmod -R 777 / var / www / html / app / cache / var / www / html / ऐप / लॉग्स ``
माइक

1
ठीक है .. मैंने प्रश्न संपादित किया :)
तूफान

अतिरिक्त स्थान एक टाइपो
तूफान

मैं आपकी समस्या को दोहराने में असमर्थ हूं। अगर मैं आपके डॉकफाइल का उपयोग करता हूं और स्थानीय रूप से कुछ डमी फाइलें सेट करता हूं, तो अनुमति सही है और सब कुछ बस काम करता है। मैं एक वेब ब्राउज़र के माध्यम से एक कंटेनर और एक्सेस कंटेंट को बूट कर सकता हूं। क्या आप विशिष्ट त्रुटि संदेशों को शामिल करने के लिए अपने प्रश्न को अपडेट कर सकते हैं? क्या आप निश्चित हैं कि आपका अपाचे विन्यास ( apache2.conf) समस्या पैदा नहीं कर रहा है? यदि आप स्थापित नहीं करते हैं तो क्या त्रुटियां दूर हो जाती हैं apache2.conf?
लार्क्स

जवाबों:


16

मेरे पास एक ही मुद्दा था और ऐसा लगता है कि docker या overlay2 में कुछ बग है यदि निर्देशिका सामग्री एक परत में बनाई गई है और इसकी अनुमतियाँ अन्य में बदली गई हैं।

वर्कअराउंड के रूप में आप अस्थायी निर्देशिका में स्रोतों की प्रतिलिपि बना सकते हैं:

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

Docker में RUN का डिफ़ॉल्ट शेल / बिन / श है और यह वह जगह है जहां अनुमतियों को सही ढंग से सेट नहीं किया जा रहा है वास्तव में एक समस्या है।

लेकिन आप आसानी से ठीक करने के बजाय बस बिन / बैश का उपयोग करने के लिए बदल सकते हैं, निर्देशिका लिस्टिंग से पहले और बाद में नोटिस कर सकते हैं

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

इसके अलावा, नए बिल्डकिट का उपयोग करने से इस सहित कई क्षेत्रों में मदद मिलती है। कोशिश करो। docs.docker.com/develop/develop-images/build_enhancements
थाड गुइड्री

6

जोड़ने का प्रयास करें:

USER root

इसने मेरे लिए काम किया।


यह स्वीकृत उत्तर होना चाहिए।
व्लादिमीर कोर्ना

2
यदि आप रूट पर स्विच करते हैं, तो संभवतः आपको पिछले उपयोगकर्ता पर वापस स्विच करना चाहिए जब आप समाप्त करते हैं या आप कंटेनर की सुरक्षा और संगतता को कम कर रहे हैं। कुछ कुबेरनेट कार्यान्वयन डिफ़ॉल्ट रूप से उदाहरण के लिए रूट के रूप में कंटेनर नहीं चलाएंगे।
झिलमिलाहट

2

यह समस्या VOLUMEअपस्ट्रीम Dockerfile के अंदर एक परिभाषा का परिणाम है । जब Dockerfile में एक वॉल्यूम परिभाषित किया गया है, तो आप सीधे छवि में COPYया ADDकमांड के साथ फाइल जोड़ सकते हैं । हालाँकि, एक RUNपंक्ति होगी:

  • डॉकटराइल के वर्तमान बिंदु के रूप में छवि परिभाषा का उपयोग करके एक अस्थायी कंटेनर बनाएं
    • उस अस्थायी कंटेनर में आपके या माता-पिता की डॉकफ़िले के अंदर निर्दिष्ट एक अनाम मात्रा होगी
    • अनाम वॉल्यूम को छवि की सामग्री से आरंभ किया जाएगा
  • आपकी कमांड कंटेनर के अंदर चलेगी
    • यदि आप इस 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अनुमति केवल लुढ़की-बैक की तरह होती है - मूल फ़ाइल अनुमति के लिए तकनीकी रूप से ओवररोड।

देव मोड के लिए फिक्स केवल chmod a+x yourfileमेजबान से है, जिसे कंपोज़िंग वॉल्यूम माउंटिंग में विरासत में मिलेगा।


1
वॉल्यूम का संपूर्ण लक्ष्य छवि के अलावा कहीं और से फ़ाइलों को माउंट करना है, इसलिए यदि आप अपनी छवि को ठीक करते हैं और उसके ऊपर वॉल्यूम बढ़ाते हैं, तो डिज़ाइन द्वारा आप अपनी छवि को नहीं देखेंगे। आपके पास वॉल्यूम क्यों है, इसके आधार पर, इसका उत्तर केवल वॉल्यूम नहीं होना हो सकता है।
BMitch

हाँ BMitch , मैं पूरी तरह से बढ़ते वॉल्यूम के प्रभाव के लिए सहमत हूं जो डॉक निर्मित छवि से कंटेनर एफएस को ओवरराइड करता है, लेकिन ... विकास के दौरान, आप निश्चित रूप से प्रत्येक और हर परिवर्तन का परीक्षण करने के लिए अपने कंटेनर का पुनर्निर्माण / पुनः आरंभ नहीं करना चाहते हैं। करना। इस बाद के परिदृश्य में क्या आप चाहते हैं कि ऐसा वॉल्यूम माउंट करें जो डॉक निर्मित छवि fs को ओवरराइड करता हो। और मुझे यहां उतरने से पहले उसी मुद्दे का सामना करना पड़ा। मुझे या तो उत्तर स्पष्टीकरण से दोषी नहीं ठहराया गया और उनमें से प्रत्येक का परीक्षण किया गया। यह केवल तभी है कि मैं समझ गया कि यह क्या चल रहा है और मेरी टिप्पणियों को पोस्ट किया गया है ...
सलाथिल जीनस

... और मुझे संदेह है कि जिस परिदृश्य का मैंने अनुभव किया, वह वही है जो उसने सवाल पूछा था।
सालेथिएल जेनसे

ओपी ने संकेत दिया कि उन्होंने इस मुद्दे को सिर्फ एक docker runआदेश के साथ देखा और कोई बाहरी मात्रा नहीं है।
16

Oups - मैंने उस पहलू को याद किया ... सही प्रश्न शीर्षक के लिए सही उत्तर, लेकिन वर्णित परिदृश्य नहीं। फिर क्या मैं उल्लेख कर सकता हूं कि मैं उपर्युक्त मुद्दे को पुन: पेश नहीं कर सकता।
सालेथिएल जेनसे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.