सिम्लिंक किए गए फ़ोल्डर को सामान्य फ़ोल्डर के रूप में कैसे प्रदर्शित किया जाए


38

मेरे पास दो डार्ट एप्लिकेशन हैं जिन्हें मुझे डॉकटराइज करने की आवश्यकता है। ये दोनों ऐप एक साझा स्रोत निर्देशिका का उपयोग करते हैं।
क्योंकि डॉकर संदर्भ निर्देशिका के बाहर फ़ोल्डर्स से फ़ाइलों को जोड़ने से रोकता है ( project/app1) मैं ../sharedन तो और न ही shared(सिमिलिंक के अंदर projects/app1) से फाइलें जोड़ सकता हूं ।

मैं वैसे भी करने के लिए Docker चाल के लिए एक रास्ता देख रहा हूँ।

मेरी सरलीकृत परियोजना संरचना

- projects
  - app1
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - app2
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - shared
    - source

मैं Dockerfileएक स्तर ऊपर ले जा सकता हूं और docker buildवहां से भाग सकता हूं लेकिन फिर मुझे एक ही निर्देशिका में दो डॉकफाइल्स (ऐप 1 और ऐप 2 के लिए) की आवश्यकता है।

मेरा वर्तमान विचार था, अगर मैं किसी तरह इस तथ्य को छिपा सकता हूं कि projects/app1/sharedयह एक सहानुभूति है तो यह समस्या हल हो जाएगी। मैंने जांच की कि क्या मैं projectsसांबा का उपयोग कर साझा कर सकता हूं और इसे कहीं और हटा सकता हूं और सांबा को सामान्य फ़ोल्डरों की तरह सिम्बलिंक्स का इलाज करने के लिए कॉन्फ़िगर कर सकता हूं लेकिन यह नहीं पाया गया है कि क्या यह समर्थित है (मुझे सांबा के साथ ज्यादा अनुभव नहीं है और अभी तक इसकी कोशिश नहीं की गई है, बस थोड़ा सा खोजा गया है) ।

क्या कोई अन्य टूल या ट्रिक है जो इसकी अनुमति देगा?

मैं इसके बजाय निर्देशिका संरचना को नहीं बदलूंगा क्योंकि यह अन्य परेशानियों का कारण बनेगा और साथ ही फाइलों की नकल भी नहीं करेगा।

जवाबों:


35

मेरे पास इतना अनुभव नहीं है कि dockerमैं वादा नहीं कर सकता कि यह काम करेगा लेकिन एक विकल्प यह होगा कि इसे लिंक करने के बजाय निर्देशिका को माउंट किया जाए:

$ cd projects/app1
$ mkdir shared
$ sudo mount -o bind ../shared shared/

यही कारण है कि जोड़ देती है ../sharedकरने के लिए ./sharedऔर पूरी तरह से व्यवस्था करने के लिए पारदर्शी होना चाहिए। जैसा कि समझाया गया है man mount:

बाँध mounts।

लिनक्स 2.4.0 के बाद से फ़ाइल पदानुक्रम का हिस्सा कहीं और हटाना संभव है। कॉल है:

mount --bind olddir newdir

या इस fstab प्रविष्टि का उपयोग करके:

/olddir /newdir none bind

इस कॉल के बाद एक ही सामग्री दो स्थानों पर सुलभ है।


1
@zoechi यह पूरी तरह से दोनों साइटों पर विषय पर है। एक सामान्य नियम के रूप में, मैं इस तरह के यू एंड एल पर अधिक तकनीकी प्रश्न और अधिक उपयोगकर्ता-अंतरिक्ष प्रश्न यहां पोस्ट करूंगा। चुनाव पूरी तरह से आप पर निर्भर है। एक ओर, यहां अधिक उपयोगकर्ता हैं, इसलिए अधिक नेत्रगोलक हैं, दूसरी तरफ, यू एंड एल पर पेशेवर * निक्स लोगों की बहुत अधिक एकाग्रता है। बस सुनिश्चित करें कि आप दोनों साइटों पर एक ही सवाल पोस्ट नहीं करते हैं। यदि आप इसे स्थानांतरित करना चाहते हैं, तो या तो इस या ध्वज को हटाएं।
टेराडॉन

2
मेरे लिए डॉकटर डेमन को फिर से शुरू करना अनिवार्य था! कंटेनर में रखा माउंट डायर दिखाई नहीं दे रहा था।
मंद

@dim हाँ! मैंने इसे Capistrano के साथ काम करने के लिए प्राप्त करने की कोशिश की और यह काम नहीं किया - मैं कंटेनर शुरू करने के बाद साझा निर्देशिकाओं को चालू करता हूं
सीएसएच

दुर्भाग्य से यह विंडोज या ओएस एक्स उपयोगकर्ताओं के लिए काम नहीं करेगा। इस मुद्दे पर बहस जीवंत रही है।
जेसन

'कण्ट्रोल' को 'कण्ट्रोल' के लिए 'कमिट' किया जाता है? या मुझे हर बार करना होगा?
276

23

यह मुद्दा डोकर समुदाय में बार-बार आया है। यह मूल रूप से आवश्यकता का उल्लंघन करता है कि Dockerfileयदि आप इसे चलाते हैं या मैं इसे चलाता हूं तो यह एक दोहराने योग्य है। इसलिए मैं इस क्षमता की उम्मीद नहीं करूंगा, जैसा कि इस टिकट में वर्णित है: डॉकरीफाइल ADD कमांड होस्ट # 1676 पर सिम्बलिंक का पालन नहीं करता है

इसलिए आपको एक अलग दृष्टिकोण की कल्पना करनी होगी। यदि आप इस मुद्दे को देखते हैं: # 6094 तर्क में सहानुभूति का समर्थन करने के लिए ADD , U & L ( @Patrick aka। Phemmer) से हमारा एक मित्र एक चतुर समाधान प्रदान करता है।

$ tar -czh . | docker build -

यह tarवर्तमान निर्देशिका से प्रतीकात्मक लिंक को हटाने के लिए कहता है, और फिर उन सभी को docker build -कमांड में पाइप करता है ।

टार मैन पेज से अंश
-c, --create
       create a new archive

-h, --dereference
       follow symlinks; archive and dump the files they point to

-z, --gzip, --gunzip --ungzip

3
यह एक उत्कृष्ट समाधान है! मुझे समझ में आया कि डोकर क्यों दावा करते हैं कि वे इस सुविधा को छोड़ना चाहते हैं। हालांकि, मेरे कंटेनरीकृत प्रोजेक्ट को विकसित करते समय उपयोग किए जाने वाले वर्कफ़्लो में काफी अंतर है और मैं उम्मीद करता हूं कि यह उत्पादन के लिए बनाया जाएगा। अपनी स्थानीय मशीन पर मुझे एक सुपर टाइट फीडबैक लूप चाहिए। मेरे ऐप में 1 git रेपो है और कंटेनरों के लिए बिल्ड वातावरण में 2nd रेपो है। मुझे यह सुनिश्चित करने में सक्षम होना चाहिए कि मैं यह निर्णय लेने और धक्का देने से पहले स्थानीय रूप से संपादन और परीक्षण का निर्माण कर सकूं। मेरे अंतिम प्रोजेक्ट में मुझे सहानुभूति या ADD निर्देश नहीं होंगे।
ब्रूनो ब्रोंस्की

6
Dockerfiles दोहराने योग्य नहीं हैं। Dockerfiles को संभवतः दोहराने योग्य नहीं बनाया जा सकता है, क्योंकि वे लगभग सभी apt-get या कुछ समतुल्य 2nd या 3rd लेयर में हैं और apt-get repeatable नहीं है। डॉकर विकास की रणनीति को असंभव सच बनाने के लिए गुमराह करने की कोशिश को रोकना डॉकटर को बुरे अमूर्त की एक श्रृंखला के साथ काठी बनाना होगा जो किसी की मदद नहीं करते हैं। nathanleclaire.com/blog/2014/09/29/…
जेसन

1
ठीक है, तो मैं वास्तव में नहीं देखता कि यह किसी cpआदेश से बेहतर क्यों है , क्या आप बता सकते हैं कि यह बेहतर क्यों है? मुझे यह भी लगता है कि पाइप भ्रामक है / अत्यधिक जटिल है। क्यों न केवल टार कमांड को बिल्ड कमांड के ऊपर रखा जाए। मुझे लगता है क्योंकि तब आप वास्तविक डायर के साथ सहिष्णु डायर को अधिलेखित कर देंगे।
अलेक्जेंडर मिल्स

1
@AlexanderMills - क्या होता है यह देखने के लिए सबसे अच्छा तरीका है कि इसे आज़माएं और अंतर देखें। इसके अलावा ऊपर एक कंटेनर की एक इमारत चल रही है, इसलिए कोई बढ़ते नहीं है। stackoverflow.com/questions/37328370/… । मैं अत्यधिक सुझाव देता हूं कि आप इन सभी चीजों को आजमाएंगे, यह अधिक समझ में आएगा।
SLM

1
मैंने सिर्फ /bin/cp ../requirements.txt . && docker build ...
डॉकटर के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.