Dockerignore: एक फ़ाइल और Dockerfile को छोड़कर सब पर ध्यान न दें


92

तो मुख्य उद्देश्य एक मोटा जार आवेदन करना था और इसे इलास्टिकबिनस्टॉक में डाल दिया। समस्या संदर्भ के साथ है। यह एक छोटा सा बेवकूफ है कि अगर मुझे जरूरत है तो वास्तव में एक ही जार फ़ाइल में इतना संदर्भ जोड़ने के लिए बेवकूफ है।

मैं .dockerignore फ़ाइल के साथ खेल रहा हूँ, लेकिन मैं हार गया हूँ। मैंने gitignore निषेध का उपयोग करने की कोशिश की, लेकिन यह काम नहीं करता है।

*
!Dockerfile
*/
!target/
target/*
!target/*.jar

वहाँ भी है कि regex के साथ बात है, लेकिन ऐसा लगता है जैसे जटिल regex समर्थित नहीं है।

^((?!Dockerfile).)*$

मैंने स्टैकओवरफ़्लो में खोज करने की भी कोशिश की है, और ये दोनों मुझे मिले हैं:

यह प्रश्न दूसरे के लिए भी संभव हो सकता है, लेकिन मुझे लगता है कि यहाँ से थोड़ा अंतर है, मैं सिर्फ एक फाइल को संदर्भ में शामिल करना चाहता हूं।

किसी भी तरह की सहायता को आभार समझेंगे।


फ़ोल्डर के लिए विस्मयादिबोधक चिह्न मेरे लिए काम करता है!
इवान एरेकी

जवाबों:


135

यदि आपको कुछ निर्देशिकाओं या फ़ाइलों को छोड़कर सब कुछ अनदेखा करने की आवश्यकता है और उन अनुमत निर्देशिकाओं के अंदर कुछ अनावश्यक फ़ाइलों को अनदेखा करें जिन्हें आप निम्न .dockerignoreफ़ाइल का उपयोग कर सकते हैं :

# Ignore everything
**

# Allow files and directories
!/file.txt
!/src/**

# Ignore unnecessary files inside allowed directories
# This should go after the allowed directories
**/*~
**/*.log
**/.DS_Store
**/Thumbs.db

8
डॉकर प्रलेखन के अनुसार यह केवल *पहली पंक्ति (इसके बजाय **) पर रखने के लिए पर्याप्त होना चाहिए । उद्धरण: "आप यह निर्दिष्ट करना चाह सकते हैं कि किन फ़ाइलों को संदर्भ में शामिल करना है, जिसके बजाय बाहर करना है। इसे प्राप्त करने के लिए, *पहले पैटर्न के रूप में निर्दिष्ट करें , उसके बाद एक या अधिक !अपवाद पैटर्न।"
जॉनी थंडरमैन

32

से dockerfile संदर्भ :

गो के फाइलपैथ से परे। नियमों के अनुसार, डॉकर एक विशेष वाइल्डकार्ड स्ट्रिंग ** का समर्थन करता है जो किसी भी संख्या में निर्देशिकाओं (शून्य सहित) से मेल खाता है। उदाहरण के लिए, ** / *। गो उन सभी फाइलों को बाहर कर देगा जो कि .go के साथ समाप्त होती हैं जो बिल्ड डायरेक्टरी के रूट सहित सभी निर्देशिकाओं में पाई जाती हैं।

तो बस एक ** ** वाली लाइन उसी निर्देशिका में सब कुछ अनदेखा कर देगी जैसे डॉकफाइल।

जैसा कि अपेक्षित है कि विस्मयादिबोधक का उपयोग किसी भी फाइल को संदर्भित करने के लिए किया जा सकता है जिसे आप डॉक डेमॉन को भेजना चाहते हैं।


3
यह अत्यंत महत्वपूर्ण है कि **फ़ाइल के शीर्ष पर जाता है, अन्यथा बहिष्करणों को अनदेखा किया जाएगा। डॉकर अंतिम नियम का उपयोग करता है जो "अंतिम" नियम के रूप में मेल खाता है, इसलिए यदि **अंतिम है तो यह सब कुछ मेल खाएगा।
tedivm

3
इसलिए **पहली पंक्ति में और !fooअगली पंक्ति में यदि fooआप एकमात्र फ़ाइल शामिल करना चाहते हैं तो शामिल करें।
सच्चा

9

यह अजीब लग सकता है, लेकिन अगर आप सभी की जरूरत है एक जार फ़ाइल है, तो आप अपने निर्माण प्रणाली में एक "docker" फ़ोल्डर बना सकते हैं जिसमें आपका Dockerfile होता है। जब आप अपने बिल्ड को चलाते हैं, तो बिल्ड स्क्रिप्ट को "जार" में सिंगल जार फाइल कॉपी करें, फिर डॉक इमेज बिल्ड ("डॉकटर" फोल्डर के अंदर से) को निष्पादित करें और जब किया जाए तो अपने डॉक रजिस्ट्री को पुश करें।


2
नमस्ते, यह बिल्कुल अजीब नहीं लगता। मुझे लगा कि यह एक सामान्य अभ्यास है, लेकिन मैं अगर संभव हो तो .dockerignore के साथ इसे करने का एक तरीका ढूंढ रहा था। इसके अलावा, मुझे वास्तव में mvn xml पसंद नहीं है :)
रोवंतो

आप एक उपनिर्देशिका और उपयोग .dockerignore में dockerfile डालकर दोनों दृष्टिकोणों को जोड़ सकते हैं। डॉक्स के अनुसार, वैसे भी ऐसा करना अच्छा है
जोनाथन ली

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