डॉकर सिम्नलिंक का संदर्भ के बाहर पालन करता है


93

अभी तक एक और डॉकर सहानुभूति सवाल। मेरे पास फ़ाइलों का एक गुच्छा है जिसे मैं अपने सभी डॉकर बिल्ड पर कॉपी करना चाहता हूं। मेरी dir संरचना है:

parent_dir
    - common_files
        - file.txt
    - dir1
        - Dockerfile  
        - symlink -> ../common_files

ऊपर दिए गए उदाहरण में, मैं चाहता हूं कि जब मैं dir1 के अंदर निर्माण करूँ, तो मुझे फाइल कॉपी की जानी चाहिए। लेकिन मैं file.txt की कई प्रतियों को बनाए नहीं रखना चाहता। प्रति डोकर संस्करण 0.10 के रूप में इस लिंक, , डोकर निर्माण होगा

ADD बिल्ड निर्देशों के लिए कंटेनर की जड़ के अंदर सिम्बलिंक्स का पालन करें।

लेकिन मुझे ऐसी कोई फ़ाइल या निर्देशिका नहीं मिलती है, जब मैं अपने डॉकफाइल में इन पंक्तियों के साथ निर्माण करता हूं:

ADD symlink /path/dirname या ADD symlink/file.txt /path/file.txt

माउंट विकल्प मेरे लिए इसे हल नहीं करेगा (क्रॉस प्लेटफॉर्म ...)। मैंने tar -czh . | docker build -tसफलता के बिना प्रयास किया।

क्या डॉकटर को सिमलिंक का अनुसरण करने और निर्मित कंटेनर में common_files / file.txt की प्रतिलिपि बनाने का एक तरीका है?

जवाबों:


70

यह संभव नहीं है और इसे लागू नहीं किया जाएगा। कृपया github मुद्दे पर चर्चा पर एक नजर # 1676 :

हम इसकी अनुमति नहीं देते क्योंकि यह पुनरावृत्ति योग्य नहीं है। आपकी मशीन पर एक सिमलिंक मेरी मशीन के समान नहीं है और एक ही Dockerfile दो अलग परिणाम देगा। साथ ही / etc / paasswd को सहानुभूति रखने से समस्याएँ पैदा होंगी क्योंकि यह होस्ट फ़ाइलों को लिंक करेगा और आपकी स्थानीय फ़ाइलों को नहीं।


धन्यवाद। हां, मैंने उस लिंक पर पहले गौर किया था लेकिन मुझे लगा कि यह बहुत पुराने संस्करण के लिए है (0.6.1)। 0.10 के परिवर्तन लॉग प्रकार के उल्लेख यह संभव है github.com/docker/docker/blob/master/…
Ravi

इसके अलावा अगर किसी भी कंप्यूटर में "parent_dir" की जांच की जाती है और यदि "सामान्य_फाइल्स" के लिए सिम्कलिन के पास संबंधित पथ है, तो यह दोहराव योग्य होगा।
रवि

2
आपके उद्धरण का Follow symlinks inside container's root for ADD build instructions.मतलब है कि कंटेनर के अंदर सिमलिंक का पालन किया जाता है। निर्माण संदर्भ निर्देशिका में नहीं। में ADD file.txt /dir/file.txtनिर्देशिका dirएक सिमलिंक हो सकता है। मेरे जवाब में मैंने जो तर्क दिए हैं, वे अभी भी मान्य हैं और नवीनतम संस्करण में अभी भी सहानुभूति का पालन नहीं किया गया है। जब आप की तरह संशोधन नियंत्रण प्रणाली में सिमलिंक की दुकान आप (repeatability के बारे में) समस्याएं हो सकती हैं Git । इसलिए कृपया इस प्रश्न का संदर्भ लें ।
0x7d7b

1
मैं जीआईटी में सहानुभूति के बारे में आपकी बात देखता हूं। लेकिन सिम्बलिंक्स को हालांकि गिट में नहीं जाना है। एक साधारण सेटअप स्क्रिप्ट स्थानीय एनवी को सिमलिंक बनाने के लिए तैयार कर सकती है। मेरे लिए, एक साझा फ़ाइल की 'एन' प्रतियां रखने की लागत रखरखाव के दृष्टिकोण से बहुत अधिक है। शायद मुझे इसे अपाचे से बाहर करना होगा। धन्यवाद।
रवि

21
क्या शर्म की बात है, जबकि मैं बिंदु को देखता हूं मैं तर्क का पालन नहीं करता हूं और यह मुझे काटता है। Git सिम्बलिंक्स को पूरी तरह से हैंडल करता है, और मुझे यह भी उम्मीद है कि सभी मशीनों और वातावरणों में काम करना होगा जहाँ स्रोत रेपो की जाँच की गई है ..!?
ग्रेगर

9

एक संभावना है कि पेरेंट डायरेक्टरी में बिल्ड को रन किया जाए:

$ docker build [tags...] -f dir1/Dockerfile .

(या समकक्ष, बाल निर्देशिका में)

$ docker build  [tags...] -f Dockerfile ..

Dockerfile को उपयुक्त रास्तों से कॉपी / जोड़ने के लिए कॉन्फ़िगर करना होगा। अपने सेटअप के आधार पर, आप चाहते हैं .dockerignoreकि माता-पिता उन चीजों को छोड़ दें जिन्हें आप संदर्भ में नहीं लाना चाहते हैं।


8

अगर किसी को अभी भी यह समस्या है, तो मुझे superuser.com पर एक बहुत अच्छा समाधान मिला:

/superuser/842642/how-to-make-a-symlinked-folder-appear-as-a-normal-folder

यह मूल रूप से टार का उपयोग करते हुए सीमलिंक को निष्क्रिय करने का सुझाव देता है और परिणाम को डॉक बिल्ड में खिलाता है:

$ tar -czh . | docker build -

: मैं 2 त्रुटियों मिल tar: Failed to clean up compressor,Error response from daemon: the Dockerfile (Dockerfile) cannot be empty
इवान Rubinson

3

simlinks का उपयोग करने के बजाय, यह संभव है कि केवल साइट से फ़ाइलों को स्थानांतरित करके समस्या को हल करना है।

इसलिए आपकी साइट का कॉन्‍फ़‍िगर केवल एक कॉपी में होगा site_available फ़ोल्डर में अगर वह बंद हो गया है या कुछ और sites_enabled में अगर इसका उपयोग किया जाना चाहिए


1

मुझे पता है कि यह डॉक बिल्ड के पोर्टेबिलिटी को तोड़ता है, लेकिन आप प्रतीकात्मक के बजाय कड़ी का उपयोग कर सकते हैं:

ln /some/file ./hardlink

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