ठीक है, यहाँ कुछ बिंदुओं पर ध्यान देने की आवश्यकता है।
आइए शुरू करते हैं कि डॉकर वॉल्यूम क्या है (इस बिंदु पर अपनी मैकबुक या योनि मशीन के बारे में सोचने की कोशिश न करें। बस इस तथ्य से सावधान रहें कि डॉकर्स एक अलग फाइल सिस्टम का उपयोग करते हैं, जहां कभी भी यह इस बिंदु पर रह सकता है):शायद कल्पना करें यह इस तरह है, डॉकर में प्रत्येक वॉल्यूम अपने आप में आंतरिक फाइल सिस्टम डॉकर उपयोग का एक हिस्सा है। कंटेनर थिसिस वॉल्यूम का उपयोग कर सकते हैं, जैसे कि वे "छोटे हार्डड्राइव" थे जिन्हें उनके द्वारा माउंट किया जा सकता है और उनके बीच भी साझा किया जा सकता है ( या एक ही समय में उनमें से दो द्वारा माउंट किया गया, जैसे कि कुछ ftp सर्वर के सुपर फास्ट संस्करण को दो क्लाइंट या जो भी हो :P) पर माउंट करना।
मूल रूप से आप इन संस्करणों को घोषित कर सकते हैं (अभी भी अपने कंप्यूटर/योनि के बारे में नहीं सोच रहे हैं, केवल डॉकर्स;)) डॉकरफाइल के वॉल्यूम निर्देश के माध्यम से। मानक उदाहरण, इस तरह एक वेबसर्वर कंटेनर चलाएं:
FROM: nginx
VOLUME /www
अब जो कुछ भी /www में जाता है, उसे सिद्धांत रूप में एक कंटेनर से माउंट और अनमाउंट किया जा सकता है और कई कंटेनरों पर भी लगाया जा सकता है। अब अकेले Nginx उबाऊ है, इसलिए हम चाहते हैं कि php उन फाइलों पर चले जो nginx कुछ और मजेदार सामग्री का उत्पादन करने के लिए स्टोर करती है। => हमें उस वॉल्यूम को कुछ php-fpm कंटेनर में माउंट करने की आवश्यकता है। हमारी कंपोज़ फ़ाइल में हम ऐसा करेंगे
web:
image: nginx
php:
image: php-fpm
volumes_from:
- web
=> वोइला! nginx/web कंटेनर में VOLUME निर्देश द्वारा घोषित प्रत्येक फ़ोल्डर php एक में दिखाई देगा। यहां ध्यान देने योग्य महत्वपूर्ण बिंदु, जो कुछ भी nginx के /www में है, जो कुछ भी php /www में है उसे ओवरराइड कर देगा। यदि आप :ro डालते हैं, तो php उस फ़ोल्डर में भी नहीं लिख सकता :)
अब आपके मुद्दे के करीब जा रहे हैं, वॉल्यूम घोषित करने का दूसरा तरीका है, जिसके लिए उन्हें डॉकरफाइल में घोषित करने की आवश्यकता नहीं है। यह मेजबान से बढ़ते वॉल्यूम द्वारा किया जा सकता है (इस मामले में आपकी योनि/boo2docker चीज़)। आइए इस पर चर्चा करते हैं जैसे कि हम पहले एक देशी लिनक्स पर चल रहे हैं।
अगर आप कुछ इस तरह रखना चाहते हैं:
volumes:
- /home/myuser/folder:/folder
आपके docker-compose.yml में, तो इसका मतलब यह होगा कि /home/myuser/folder अब docker में आरोहित हो जाएगा। यह डॉकटर के पास/फ़ोल्डर में जो कुछ भी है उसे ओवरराइड कर देगा और जैसे/www भी उस चीज़ से पहुंच योग्य होगा जिसने इसे घोषित किया था। अब जिस Linux मशीन पर docker डेमॉन चल रहा है।
सिद्धांत के लिए बहुत कुछ :), वास्तव में आपको अपनी सामग्री को आगे बढ़ाने के लिए शायद निम्नलिखित सलाह की आवश्यकता है :):
जिस तरह से boot2docker/docker-machine/kitematic और ये सभी चीजें इस मुद्दे से निपटती हैं, बस यह है कि वे सबसे पहले योनि मशीन में एक वॉल्यूम को डॉकटर कंटेनरों में माउंट करते हैं, और वे बस इस चीज़ को आपके मैक फाइल सिस्टम में भी माउंट करते हैं। , उम्मीद है कि यह सब ठीक हो जाएगा :P
अब व्यावहारिक समस्या के लिए हम सभी इसका उपयोग कर रहे हैं (या सिर्फ अपने सहकर्मियों को मीठे मीठे डॉकर की दुनिया में मदद करने की कोशिश कर रहे हैं:पी) मैक पर अनुमतियों का सामना कर रहे हैं। मेरा मतलब है कि इसके बारे में सोचें (रूट या कुछ अन्य उपयोगकर्ता कंटेनर में फाइलों को संभालते हैं, उपयोगकर्ता योनि योनि मेजबान में फाइलों को संभाल सकता है और फिर आपका मैक उपयोगकर्ता "स्काल्फ़ीफैन" मैक में उन फाइलों को संभालता है। उन सभी के पास अलग-अलग उपयोगकर्ता आईडी हैं और क्या नहीं => इसके साथ कई समस्याएं आती हैं, और कुछ हद तक इस बात पर निर्भर करता है कि आप वास्तव में डॉकर में क्या चला रहे हैं। मैसकल और अपाचे विशेष रूप से दर्दनाक हैं, क्योंकि वे कंटेनर के भीतर रूट के रूप में नहीं चलते हैं। इसका मतलब है, उन्हें अक्सर मैक फ़ाइल में लिखने में परेशानी होती है प्रणाली।
नीचे दिए गए दूसरे दृष्टिकोण को आज़माने से पहले, बस अपने कंटेनर वॉल्यूम को अपने मैक होम डायरेक्टरी के अंतर्गत रखने का प्रयास करें। यह ज्यादातर मामलों में MySQL के साथ मुद्दों को हल करेगा जैसा कि मैंने समय के साथ पाया है। बीटीडब्ल्यू:वॉल्यूम के लिए पूर्ण पथ घोषित करने की आवश्यकता नहीं है ./folder ठीक है और उस स्थान के सापेक्ष पढ़ा जाता है जहां आपका docker-compose.yml रहता है! मजबूत>
बस अपने मैक यूज़र फोल्डर में कंपोज़-वाईएमएल डालें, बस यही मायने रखता है। नहीं chmod 777 -R :P यहां आपकी मदद करेगा, इसे बस आपके होम फोल्डर के नीचे होना चाहिए :)
फिर भी कुछ ऐप्स (उदाहरण के लिए अपाचे) आपको अभी भी कठिन समय देंगे। तथ्य यह है कि कंटेनर में जो कुछ भी चलता है उसकी यूजर आईडी आपके मैक यूजर आईडी से अलग होती है जो आपके जीवन को नरक बना देगी। इससे बचने के लिए, आपको यूज़र आईडी के साथ-साथ यूज़र समूह को इस तरह से समायोजित करने की ज़रूरत है जो आपके मैक की अनुमतियों के साथ विरोध न करे। मैक पर आप जो समूह चाहते हैं वह कर्मचारी है, एक यूआईडी जो काम करता है वह उदाहरण के लिए 1000 होगा। इसलिए आप इसे अपने डॉकरफाइल के अंत में रख सकते हैं:
RUN usermod -u 1000 www-data
RUN usermod -G staff www-data
या
RUN usermod -u 1000 mysql
RUN usermod -G staff mysql
तो जैसा कि आप अब सीख चुके हैं:
ठीक है, यह वही करता है :)
यह आप गलत हो गया :) जैसा कि समझाया गया है, यदि आप एक होस्ट फ़ोल्डर नहीं देते हैं, तो डॉकर इस पथ को जारी रखेगा। लेकिन केवल इस कंटेनर के लिए और सभी डॉकर फाइल सिस्टम के भीतर रहेंगे। मेजबान को कुछ भी नहीं लिखा है! यह हमेशा तभी होगा जब आप कंटेनर फ़ोल्डर से पहले एक होस्ट फ़ोल्डर देंगे!
आशा है कि इससे मदद मिली :)