कर्ता के साथ लेकिन बहिष्कार के साथ


230

Dockerfile में, मेरे पास है

COPY . .

मैं एक पूरी निर्देशिका को बाहर करना चाहता हूं, मेरे मामले में, नोड_मॉड्यूल निर्देशिका।

कुछ इस तरह:

   COPY [all but **/node_modules/**] .

क्या डॉकर के साथ यह संभव है?


23
कैसे के बारे में .dockerignore?
एंथोनी सॉटिले

मैं इस संबंधित प्रश्न का उत्तर ढूंढ रहा हूं: stackoverflow.com/questions/50547489/…
अलेक्जेंडर मिल्स

जवाबों:


377

.dockerignoreअपने docker निर्माण संदर्भ निर्देशिका में फ़ाइल बनाएँ (इसलिए इस मामले में, सबसे अधिक संभावना है कि एक निर्देशिका जो नोड_मॉडल के लिए एक अभिभावक है) इसमें एक पंक्ति के साथ:

**/node_modules

हालांकि आप शायद सिर्फ चाहते हैं:

node_modules

Dockerignore से संबंधित जानकारी: https://docs.docker.com/engine/reference/builder/#dockerignore-file


5
धन्यवाद, इसलिए "COPY।" कमांड को बदलने की आवश्यकता नहीं है, मुझे लगता है
अलेक्जेंडर मिल्स

वास्तव में नहीं: /config/nginx/ /config/logstash/मैं इसे कंटेनर बैश में ls config/ gunicorn logs logstash nginx
पाता हूं

3
@SalahAdDin उसी कारण के लिए जिसे आपने नहीं लिखा ls /config/था, क्या आपने उन रास्तों को जोड़ने की कोशिश की जो प्रमुख के बिना आपके .dockerignore में थे /?
पाब्लो

8
सिर्फ node_modulesउपनिर्देशिका में काम नहीं करता है।
रस्टीक्स

5
यह वास्तव में समस्या को हल नहीं करता है अगर आप इसे कॉपी करना चाहते हैं लेकिन सिर्फ उस परत में नहीं ...
वेस

33

उन लोगों के लिए जो एक .dockerignore फ़ाइल का उपयोग नहीं कर सकते हैं (उदाहरण के लिए यदि आपको एक COPY में फ़ाइल की आवश्यकता है, लेकिन किसी अन्य की नहीं):

हां, लेकिन आपको कई COPY निर्देशों की आवश्यकता है। विशेष रूप से, आपको फ़ाइल नाम में प्रत्येक अक्षर के लिए एक COPY की आवश्यकता होती है जिसे आप बाहर करना चाहते हैं।

COPY [^n]*    # All files that don't start with 'n'
COPY n[^o]*   # All files that start with 'n', but not 'no'
COPY no[^d]*  # All files that start with 'no', but not 'nod'

तब तक जारी रखें जब तक कि आपके पास पूर्ण फ़ाइल नाम न हो, या बस उपसर्ग हो, आप निश्चित रूप से सुनिश्चित करें कि आपके पास कोई अन्य फ़ाइल नहीं होगी।


1
यह तब नहीं होगा, क्योंकि COPY failed: no source files were specifiedजब आप कोई फ़ाइल नहीं 'नहीं' से शुरू करते हैं, तो 'wod' मिलते हैं, लेकिन 'nod' नहीं।
mheck

1
वैकल्पिक रूप से, आप दो अलग-अलग उप-निर्देशिकाओं (विभिन्न प्रतिलिपि लक्ष्यों के लिए) का उपयोग कर सकते हैं, ताकि मेरे नगीनेक्स सेटअप में उदाहरण के लिए, मुझे जाना src/होगा /var/wwwऔर /conf/nginx.confजाना होगा /etc/nginx/conf.d/default.conf। इसके अलावा, आप सब कुछ कॉपी कर सकते हैं, और RUN rm -r confबाद में (स्रोत के पेड़ को भी वैसा ही रख सकते हैं)। मैं यह सुनना चाहूंगा कि क्या किसी और का सुझाव है।
युवल

1
यदि मैं इस तरह से करूँ तो विशिष्ट फ़ाइल प्रकारों या फ़ाइल समाप्ति के लिए क्या समाधान होगा?
ली रेमन

इस दृष्टिकोण का केवल नकारात्मक पक्ष यह है कि आपके फ़ोल्डर की संरचना चपटी है
इस्लाम Q।

यदि आपके पास कॉपी किए जाने के लिए केवल कुछ निर्देशिकाएं हैं (केवल 'ऐप' या '/ src' कहें)। एक सरल तरीका यह होगा कि निर्देशिकाओं को व्यक्तिगत रूप से कॉपी किया जाए (उनकी संरचना रखने के लिए) और फिर आपको केवल COPY [^node_modules]*शीर्ष स्तर की सभी फ़ाइलों की प्रतिलिपि बनाने के लिए एक की आवश्यकता होगी ।
smdufb

9

मेरे मामले में, मेरे डॉकरफाइल में एक इंस्टालेशन स्टेप था, जो vendorडायरेक्टरी (PHP समकक्ष node_modules) का उत्पादन करता था । मैं तो COPYअंतिम आवेदन छवि पर इस निर्देशिका। इसलिए, मैं बयान नहीं कर पाए vendorमेरे में .dockerignore। मेरा समाधान केवल प्रदर्शन composer install(PHP समकक्ष npm install) करने से पहले निर्देशिका को हटाने के लिए था ।

FROM composer AS composer
WORKDIR /app
COPY . .
RUN rm -rf vendor \
    && composer install 

FROM richarvey/nginx-php-fpm
WORKDIR /var/www/html
COPY --from=composer /app .

यह समाधान काम करता है और अंतिम छवि को ब्लोट नहीं करता है, लेकिन यह आदर्श नहीं है, क्योंकि vendorहोस्ट पर निर्देशिका को निर्माण प्रक्रिया के दौरान डॉकर संदर्भ में कॉपी किया जाता है, जो समय जोड़ता है।


3
ध्यान दें कि आपको composer.lockपहले क्यों निकालना है composer install। लॉक फ़ाइल के बिना, निर्भरता का एक अलग सेट (विक्रेता फ़ोल्डर) स्थापित किया जा सकता है जब आप अगली बार बनाते हैं।
Lacek

1
@Lacek: आप सही हैं। मैंने जब से यह पोस्ट किया है मैंने बेहतर सीखा है।
कैमरन हडसन

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

2

जोड़ना .dockerignore मेरे लिए काम करता है। एक अतिरिक्त बिंदु जो लोग विंडोज पर इस समाधान की कोशिश कर रहे हैं , विंडोज़ आपको .dockerignore फ़ाइल बनाने की अनुमति नहीं देगा (क्योंकि यह डिफ़ॉल्ट रूप से फ़ाइल बनाने की अनुमति नहीं देता है।)

ऐसी फाइल बनाने के लिए जिसके साथ शुरू करना है। विंडोज पर , एक एंडिंग डॉट भी शामिल करें, जैसे: .dockerignore.और हिट एंटर (बशर्ते आपने फ़ोल्डर विकल्पों से दृश्य एक्सटेंशन विकल्प सक्षम किया हो)


6
आप विंडोज़ में एक फाइल बना सकते हैं जो एक डॉट से शुरू होती है और एक डॉट से इसे समाप्त भी करती है।
जिम पेडिड

0

वर्तमान निर्देशिका से नोड_मॉडल को छोड़कर

node_modules

किसी भी तत्काल उपनिर्देशिका में नोड_मॉडल को छोड़कर

*/node_modules

यहाँ आधिकारिक डॉक्स है

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