बहुत बड़ी छवि के लिए निर्माण का संदर्भ


142

मैंने अपने होस्ट मशीन पर कुछ अलग-अलग निर्देशिकाएं बनाई हैं क्योंकि मैं अपने डॉकटरों को व्यवस्थित रखने के लिए डॉकटर के बारे में जानने की कोशिश करता हूं। मेरा डॉकफाइल मैं बस भाग गया ऐसा दिखता है:

FROM crystal/centos
MAINTAINER crystal

ADD ./rpms/test.rpm ./rpms/ 
RUN yum -y --nogpgcheck localinstall /rpms/test.rpm 

मेरा वास्तविक आरपीएम केवल 1 जीबी है। लेकिन जब मैं करने की कोशिश करता हूं sudo docker build -t="crystal/test" ., तो मुझे डॉकर डेमन 3.5 जीबी का निर्माण संदर्भ मिलता है। वहाँ कुछ और है कि मैं अनजान हूँ के रूप में आप Docker छवियों का निर्माण जारी है? क्या मेरी मेमोरी संचित हो रही है क्योंकि मैं अपने मेजबान मशीन पर अपनी अन्य निर्देशिकाओं में अधिक छवियां बनाता हूं?


2
निर्माण संदर्भ वर्तमान निर्देशिका में सभी फाइलें / निर्देशिकाएं हैं।
Nabin

इस निर्देशिका में केवल उन फ़ाइलों को रखें जिनकी आपको आवश्यकता है। यही है, डॉकफाइल और किसी भी स्थानीय फाइल / निर्देशिका को कॉपी किया गया / डॉकफर्इल में बिल्ड इमेज में जोड़ा गया। इसके अलावा, का उपयोग करें.dockerignore
विश्रांत

जवाबों:


266

डॉकर क्लाइंट पूरे "बिल्ड संदर्भ" को डॉकर डेमन को भेजता है। वह निर्माण संदर्भ (डिफ़ॉल्ट रूप से) संपूर्ण निर्देशिका Dockerfileहै (इसलिए, संपूर्ण rpmsपेड़)।

आप .dockerignoreकुछ फ़ाइलों को अनदेखा करने के लिए डॉकर पाने के लिए एक फ़ाइल सेटअप कर सकते हैं । आप इसके साथ प्रयोग करना चाह सकते हैं।

वैकल्पिक रूप से, आप अपने rpmsफ़ोल्डर को एक निर्देशिका स्तर अपने से ऊपर ले जा सकते हैं Dockerfile, और केवल सिरिंज test.rpmको Dockerfile's' निर्देशिका में बदल सकते हैं।


जैसा कि कई उपयोगकर्ताओं ने टिप्पणियों में बताया है, एक को उस .gitफ़ोल्डर को जोड़ने की.dockerignore आवश्यकता है जो मेरे मामले में 150 एमबी -> 5 जीबी अंतर का कारण था।


4
दुर्भाग्य से ऐसा लगता है कि इस मामले में सहानुभूति संभव नहीं है क्योंकि ADDएक निर्माण के दौरान कमांड लिंक से लिंक का पालन नहीं करता है। देखें: github.com/docker/docker/issues/1676
JimmidyJoo

5
जीवन रक्षक! यकीन है कि जोड़ने के लिए किया जा: डेवलपर्स रेल tmp logके लिए .dockerignore+ अन्य कस्टम
equivalent8

7
.dockerignore फ़ाइल के लिए .git फ़ोल्डर को जोड़ना न भूलें (मान लें कि आप git का उपयोग कर रहे हैं)
dsncode

8
हां, .gitफ़ोल्डर डिफ़ॉल्ट रूप से शामिल है - यह निश्चित रूप से मुझे बाहर पकड़ा गया।
पॉल सुआर्ट

1
वास्तव में "निर्माण संदर्भ" क्या है? मैंने डॉक बिल्ड आरयूएन कमांड का उपयोग करके इन फाइलों को देखने की कोशिश की, लेकिन मुझे डॉक फाइल सिस्टम (बिल्ड समय के दौरान) में अपने डॉकरीफाइल फ़ोल्डर में फाइलें नहीं दिखती हैं। क्या कोई मुझे एक सरल उदाहरण दे सकता है कि बिल्ड संदर्भ कैसे उपयोगी है?
पैट्रिक

52

अपडेट 2019

डॉकर v18.06 से शुरू होकर बिल्ड किट नामक एक नई छवि बिल्डर का उपयोग करने का विकल्प है ।

यह डॉकर के साथ पूर्व-बंडल किया गया है, कुछ भी स्थापित करने की आवश्यकता नहीं है। यह Dockerfileसिंटैक्स के साथ संगत है , इसे बदलने की कोई आवश्यकता नहीं है Dockerfile

लीगेसी डोकर बिल्ड न्यू डॉक बिल्डकिट बनाम

यहाँ निर्माण निर्देशिका में एक विशाल अप्रयुक्त फ़ाइल के साथ एक छवि बनाने का एक उदाहरण है:

लीगेसी डॉकर बिल्ड:

$ time docker image build --no-cache .
Sending build context to Docker daemon  4.315GB
[...]
Successfully built c9ec5d33e12e

real    0m51.035s
user    0m7.189s
sys 0m10.712s

नया डोकर बिल्डकिट:

$ time DOCKER_BUILDKIT=1 docker image build --no-cache .
[+] Building 0.1s (5/5) FINISHED                                                
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 37B                                        0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
[...]
 => => writing image sha256:ba5bca3a525ac97573b2e1d3cb936ad50cf8129eedfa9  0.0s

real    0m0.166s
user    0m0.034s
sys 0m0.026s

केवल परिवर्तन DOCKER_BUILDKIT=1पर्यावरण चर है, समय में अंतर बहुत बड़ा है।

.dockerignore फ़ाइल

कृपया ध्यान दें, कि .dockerignoreफाइल अभी भी मान्य और उपयोगी है। Dockerfileजैसे कुछ आदेश COPY . .अभी भी .dockerignoreनियमों को ध्यान में रखेंगे । लेकिन बिल्ड निर्देशिका में साइड फाइल्स (संदर्भित नहीं Dockerfile) बिल्डकिट द्वारा "बिल्ड संदर्भ" के रूप में अब कॉपी नहीं की जा रही हैं।


1
यह ध्यान रखना महत्वपूर्ण है कि DOCKER_BUILDKIT वर्तमान में विंडोज कंटेनरों के लिए समर्थित नहीं है। (लिनक्स केवल, सीमाओं के तहत सूचीबद्ध: docs.docker.com/develop/develop-images/build_enhancements )
वैकैनो

18

मैंने इसे अपने डॉकरीफाइल और डॉकटर-कंपोज़.आईएमएल को एक सबफ़ोल्डर में स्थानांतरित करके तय किया और इसने बहुत काम किया। जाहिरा तौर पर डॉकटर वर्तमान फ़ोल्डर को डेमॉन में भेजता है और मेरा फ़ोल्डर 9 गीगा था।


4
यह विधि निषिद्ध पथ प्रदान करती है: बिल्ड संदर्भ त्रुटि के बाहर यदि कोई मूल निर्देशिका से किसी फ़ाइल की प्रतिलिपि बनाई जा रही है, तो इसके लिए कोई समाधान?
किटवद्र्र

8

यदि आपके पास एक .dockerignoreफ़ाइल है और निर्माण संदर्भ अभी भी बड़ा है, तो आप जाँच सकते हैं कि क्या द सिल्वर खोजक का उपयोग करके docker build reference में भेजा जा रहा है :

ag --path-to-ignore .dockerignore --files-with-matches

ध्यान दें कि कुछ **पैटर्न ठीक से काम नहीं कर सकते हैं।

अतिरिक्त टिप्पणियों के लिए इस Github मुद्दे को देखें: https://github.com/moby/moby/issues/16056


4

मेरे मामले में जब मैं गलत -fतर्कों के साथ निष्पादित था - निर्देशिका के पथ के बिना जहां डॉकफाइल स्थित था

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile /home/DF/ - सही

docker build --no-cache -t nginx5 -f /home/DF/Dockerfile - गलत


1

यदि आप अपने बिल्ड संदर्भ के पूर्ण नियंत्रण में रहना चाहते हैं तो आप कंटेनर को बिना किसी संदर्भ और COPYप्रासंगिक डेटा के कंटेनर में पूरी तरह से निर्मित कर सकते हैं ।

docker build - < Dockerfile

इसका एक नकारात्मक पहलू यह होगा कि इस दृष्टिकोण के साथ आप केवल ADDदूरस्थ URL के डॉकरफाइल में चीजें कर सकते हैं, न कि अपने स्थानीय होस्ट से फाइलें।

Https://docs.docker.com/engine/reference/commandline/build/#build-with-- देखें


0

मेरे पास फ्रीस्टाइलर जैसा ही मुद्दा था। हालाँकि मैं अपने संदर्भ से एक निर्देशिका से निर्माण कर रहा था। तो -f तर्क सही थे संदर्भ गलत था।

project 
|
-------docker-dir 

निम्नलिखित में से डॉक-डायर का निर्माण ठीक था

docker build -t br_base:0.1 . 

डॉक से भवन निर्माण संदर्भ बदल गया। इसलिए मुझे कमांड में संदर्भ बदलने की जरूरत थी। प्रसंग 'द्वारा दिया गया है।' ऊपर दिए गए आदेश में।

प्रोजेक्ट डायरेक्टरी से नया कमांड होना चाहिए

docker build -t br_base:0.1 ./base

यहाँ प्रसंग'//ase 'द्वारा दिया गया है


0

यदि आप छवि बना रहे हैं और संदेश भेज रहे हैं तो डॉकर डेमॉन को संदर्भ भेजें जो कॉपी करने के लिए लॉग समय ले रहा है,

फिर .dockerignore फ़ाइल जोड़ें । इसमें उन फ़ाइलों या निर्देशिका को शामिल किया जाना चाहिए जिन्हें कॉपी करने की आवश्यकता नहीं है।


0

फ़ाइल के लिए NodeJS Application, .dockerignoreअपने रूट प्रोजेक्ट डायरेक्टरी को .dockerignoreजोड़ें और फाइल के अंदर निम्नलिखित जोड़ें

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