Docker: Mounts से इनकार किया। पथ ... OS X से साझा नहीं किए जाते हैं और उन्हें Docker के लिए नहीं जाना जाता है


108

कमांड docker run -v /var/folders/zz/...निम्न त्रुटि उत्पन्न करता है।

docker: Error response from daemon: Mounts denied: 
The paths /var/folders/zz/... and /var/folders/zz/...
are not shared from OS X and are not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.

जब मैं फ़ाइल साझाकरण खोलता हूं, तो मैं देखता हूं कि / निजी पहले से सूचीबद्ध है।

यदि मैं जोड़ने का प्रयास /var/folder/करता हूं , तो यह हल हो जाता है /private/var/folders, जो / निजी का सबसेट है और इसलिए जोड़ को अस्वीकार कर दिया गया है।

संक्षेप में, यह मुझे ऐसा लगता है जैसे निर्देशिका /var/folders/..को ओएस एक्स द्वारा एक उपनिर्देशिका के रूप में साझा किया गया है /privateऔर इसलिए इसे डॉकर के लिए जाना जाना चाहिए। इसे हल करने पर कोई मदद की सराहना की जाएगी।

एक प्रयोग के रूप में, मैंने /privateफ़ाइल साझाकरण में फ़ाइल को बदल दिया /private/var/foldersऔर docker को पुनः आरंभ किया लेकिन परिणाम नहीं बदला।

बस अधिक संपूर्ण संदर्भ के लिए, यह .sh स्क्रिप्ट है , जो इस पायथन स्क्रिप्ट को चलाता है , जो बदले में डॉक कमांड चलाता है।


3
क्या आपने कोशिश की -v /private/var/folders/zz/...?
दान लोए

@DanLowe: मैं नहीं था, क्योंकि कोड की तरह WORKING_DIR="$(mktemp -d)और, चला गया -v ${WORKING_DIR}। लेकिन यह हैकिंग WORKING_DIR="/private"$(mktemp -d), इस मुद्दे को हल करने के लिए लगता है। बहुत बहुत धन्यवाद :)
आयुष

मैं यह बताते हुए एक उत्तर पोस्ट करूंगा कि जब मैंने कुछ मिनटों में काम किया, तो यह काम क्यों किया
डैन लोव

यह बहुत अच्छा होगा, फिर से धन्यवाद।
आयुष

मैं उसी त्रुटि संदेश का सामना करता हूं। मेरी स्थिति में आपकी निर्देशिका में कोई स्थान शामिल नहीं है मैं "सर्वर साइड" को "सर्वरसाइड" में बदल देता हूं फिर इसे हल किया गया। आशा है कि यह कुछ मदद कर सकता है।
andrew54068

जवाबों:


129

मैक वॉल्यूम माउंट के लिए डॉकर बेस डॉकर सिस्टम की तुलना में अलग तरह से व्यवहार करता है। यह ज्यादातर इसलिए है क्योंकि डॉकर एप्पल के फाइल सिस्टम सैंडबॉक्स दिशानिर्देशों का पालन करने की कोशिश करता है।

जैसा कि डॉकर की प्राथमिकताओं में दिखाया गया है, केवल कुछ निश्चित रास्ते macOS द्वारा निर्यात किए जाते हैं।

  • /Users
  • /Volumes
  • /tmp
  • /private

फ़ाइल साझाकरण प्राथमिकता पैनल

/var macOS में एक प्रतीकात्मक लिंक है /private । यह भी सच है /tmp:

$ ls -ld /tmp /var
lrwxr-xr-x@ 1 root  wheel  11 Jan 26 16:18 /tmp -> private/tmp
lrwxr-xr-x@ 1 root  wheel  11 Jan 26 16:18 /var -> private/var

/tmpसाझाकरण पैनल में सूचीबद्ध क्यों है , लेकिन/var (भले ही दोनों का एक हिस्सा नहीं है /private)? फाइलसिस्टम नामस्थान के बारे में मैक के दस्तावेज के लिए डॉकटर बताते हैं:

डिफ़ॉल्ट रूप से, आप फ़ाइलों को साझा कर सकते हैं /Users/ , /Volumes/, /private/, और /tmpसीधे। डॉकर को निर्यात किए जाने वाले डायरेक्टरी ट्री को जोड़ने या हटाने के लिए, डॉक प्राथमिकताएं व्हेल मेनू में फाइल शेयरिंग टैब का उपयोग करें -> प्राथमिकताएं -> फाइल शेयरिंग। (प्राथमिकताएँ देखें।)

-vबाइंड माउंट में इस्तेमाल होने वाले अन्य सभी रास्तों को डब्बी कंटेनरों को चलाने वाले Moby Linux VM से प्राप्त किया जाता है , इसलिए इस तरह की दलीलों -v /var/run/docker.sock:/var/run/docker.sockको उम्मीद के काम करना चाहिए। यदि कोई macOS पथ साझा नहीं किया गया है और VM में मौजूद नहीं है, तो इसे माउंट करने का प्रयास करने के बजाय इसे VM में बनाने में विफल हो जाएगा। वे रास्ते जो पहले से ही VM में मौजूद हैं और फाइलें डॉकियर द्वारा आरक्षित हैं और उन्हें macOS से निर्यात नहीं किया जा सकता है।

ध्यान दें कि /var/runविशेष रूप से यहां एक जगह के रूप में उल्लेख किया गया है जो कि मैक वीओएस के बजाय लिनक्स वीएम से माउंट किया जाएगा।

जब आप वॉल्यूम माउंट के लिए पूछते हैं, तो पहले macOS फाइलसिस्टम निर्यात की जांच की जाती है। अगर वहां कोई मेल नहीं है, तो लिनक्स वीएम जहां डॉकर चल रहा है, अगले चेक किया गया है। यदि उनमें से किसी के पास आपके द्वारा अनुरोधित पथ नहीं है, तो माउंट विफल हो जाता है।

आपके मामले में, /varmacOS द्वारा निर्यात नहीं किया गया है। /varलिनक्स VM में मौजूद है, लेकिन/var/folders ऐसा नहीं है। इसलिए, पथ उपलब्ध नहीं है, और माउंट विफल रहता है।

यदि आप पथ को बदलते हैं /private/var, तो यह सफल होगा, क्योंकि macOS /privateबढ़ते हुए पूरे फाइलसिस्टम ट्री को निर्यात करता है ।

चीजों को अधिक पोर्टेबल बनाने के लिए, आप यह परीक्षण कर सकते हैं कि आप वर्तमान में कौन से प्लेटफ़ॉर्म पर चल रहे हैं, और यदि यह macOS है, तो माउंट के साथ उपसर्ग करें /private


4
@ सैमुअलमेन्डेज़ सिर्फ पहला। प्रारूप है mac-path:container-path, और /privateकेवल मैक के पक्ष में मौजूद होगा।
दान लोवे

2
मैं इसी तरह की समस्या का सामना कर रहा हूं, कोई भी मुझे हल करने में मदद कर सकता है ("b'Mounts ने इनकार किया: \ r \ n मार्ग / आदि / स्थानीय समय \ r \ n ओएस एक्स से साझा नहीं किया गया है और डॉकर के लिए ज्ञात नहीं है। \ r \ n आप साझा किए गए स्थान कॉन्फ़िगर कर सकते हैं।" Docker से -> वरीयताएँ ... -> फ़ाइल साझाकरण। अधिक जानकारी के लिए \ r \ nSee docs.docker.com/docker-for-mac/osxfs/#namespaces । \ r \ n। "" को / आदि के माध्यम से जोड़ने का प्रयास किया गया है। Docker -> प्राथमिकताएँ ... -> फ़ाइल साझा करना यह कहता है / etc मैक ओएस के लिए आरक्षित है किसी भी समाधान लोग?
संदीश कुमार HN

1
@DanLowe प्रतिक्रिया के लिए धन्यवाद। यदि मैं / निजी / आदि / स्थानीय जोड़ने की कोशिश कर रहा हूं, तो "निर्यात पथ / निजी / आदि / स्थानीय समय निर्यात पथ / निजी के साथ ओवरलैप हो रहा है।" मैंने "/ etc / localtime" जोड़कर थक गया, लेकिन नई त्रुटि मिली "APIError: 500 सर्वर त्रुटि: आंतरिक सर्वर त्रुटि (माउंट स्रोत पथ बनाते समय त्रुटि" / etc / localtime ': mkdir / etc / localtime: फ़ाइल मौजूद है) " कोई उपाय??
संदीश कुमार HN


1
@DanLowe अपनी तरह के जवाब के लिए धन्यवाद। मैं तुम्हें समझता हूं। जब हम मैक ओएस पर विकसित होते हैं, तो उबंटू पर तैनात होते हैं। हम वॉल्यूम / आदि / स्थानीय समय के लिए डॉक-कंपोज का उपयोग करते हैं। क्या हम सिस्टम की जांच करने वाले हैं और अलग-अलग रास्ता तय करते हैं? जैसा /private/etc/localtimeमैक ओएस, के लिए /etc/localtimeubuntu के लिए। Docker-compose.yml में सिस्टम की जानकारी कैसे बताएं? धन्यवाद!
17

4

एक विकल्प के रूप में समाधान:

से रास्ता बदलो /private/instance1-data:/home करने के लिए./instance1-data:/home

* निक्स भूमि और इसलिए, डॉकर, .वर्तमान निर्देशिका को इंगित करता है। चूंकि macOS सैंडबॉक्सिंग के बारे में भी picky कोण हो रहा है, यह macOS के लिए एक व्यवहार्य समाधान की तरह लगता है। बस के लिए आवश्यक फ़ोल्डर बनाएँinstance1 उसी निर्देशिका में ।

इस समाधान का एक और लाभ यह है कि यह docker-composeसाथ चलने की आवश्यकता को हटा देता है sudo। भले ही, यह इस मामले में कोई नुकसान नहीं पहुंचाता लेकिन फिर भी, यह एक प्लस है।


2

एक उदाहरण के रूप में, पोर्टेनेर का उपयोग करते हुए, यह कमांड मेरे लिए काम करता है:

docker run -d --restart unless-stopped -p 9000:9000 \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v /var:/data portainer/portainer --no-auth

लेकिन, अगर मैं -v /var:/dataबिल्कुल अलग हूँ , यह काम नहीं करेगा। मुझे लगता है (लेकिन यकीन नहीं है) कि इसकी वजह से डॉकर एक mddir करने की कोशिश कर रहा है। तो, अगर मैं माउंट करने की कोशिश करता हूं-v /var/whatever:/data mkdir विफल रहता है क्योंकि पर्याप्त अनुमति नहीं है, और यह काम नहीं करता है।

मेरे पास 2 मैक (हाई सिएरा) है और मैंने इसे दोनों पर आजमाया। एक ही समस्या है। इसके अलावा, मैंने डॉकर बीटा चैनल का उपयोग करने की कोशिश की। मुझे लगता है कि मैं डैन लोव के उत्तर को समझता हूं: अगर यह मेरे लिए काम करता है तो मैं इस उत्तर को अपडेट करूंगा।


2

मुझे इसी तरह की समस्या थी जहां मैंने /var/tmpअपने मैक में एक निर्देशिका बनाई थी जिसे मैं अपने डॉकटर कंटेनर में माउंट करना चाहता था।

एक फ़ाइल के लिए निर्देशिका पथ जोड़कर इसे हल किया:

$ cat ~/Library/Group\ Containers/group.com.docker/settings.json  
{
  "filesharingDirectories" : [
    "\/Users",
    "\/Volumes",
    "\/private",
    "\/tmp",
    "\/var\/tmp"
  ],
…

अब मैं /var/tmpडॉकर में निर्देशिका देख सकता हूं-> वरीयता-> संसाधन-> फाइल शेयरिंग। फिर मैंने कर्ता को फिर से शुरू किया।

इसने मेरी बढ़ती समस्या को हल कर दिया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.