2016-08-30 10 views
7

docker build . वर्तमान निर्देशिका में Dockerfile दिए गए डॉकर छवि को पुनर्निर्माण करेगा, और .dockerignore फ़ाइल से मेल खाने वाले किसी भी पथ को अनदेखा करेगा।मैं कैसे देख सकता हूं कि किस फ़ाइल ने डैशरफ़ाइल `COPY` कथन को कैश को अमान्य करने के लिए किया?

किसी भी COPY उस डॉकरफाइल में बयान बिल्ड कैश को अमान्य होने का कारण बनेंगे यदि डिस्क पर फ़ाइलों को आखिरी बार बनाया गया था।

मैंने देखा है कि अगर आप .git dir को अनदेखा न करें, git fetch की तरह साधारण चीजें हैं जो कोई पक्ष प्रभाव है निर्माण कैश अवैध हो जाएगी (शायद क्योंकि .git निर्देशिका के भीतर कुछ ट्रैकिंग जानकारी बदल गया है।

यह अगर मुझे पता था कि ठीक जो वजह से कैश अवैध बनने के लिए फ़ाइलों को देखने के लिए कैसे बहुत मददगार होगा ... लेकिन मैं एक तरह से खोजने में असमर्थ किया गया है।

उत्तर

2

मुझे नहीं पता सोचें कि यह देखने का एक तरीका है कि किस फाइल ने कैश को अमान्य कर दिया था वर्तमान Docker image design

परतें और छवियां since v1.10 are 'content addressable'। उनकी आईडी एक SHA256 चेकसम पर आधारित है जो उनकी सामग्री को दर्शाती है।

caching code बस छवि/परत की आईडी देखता है जो पूरे परत मिलान (या संभवतः एक टकराव) की सामग्री में केवल डॉकर इंजन में मौजूद होगा।

तो जब आप docker build चलाते हैं, तो Dockerfile में प्रत्येक कमांड के लिए एक नया निर्माण संदर्भ बनाया गया है। एक चेकसम की गणना पूरे परत के लिए की जाती है जो कमांड उत्पन्न करेगा। फिर डॉकर यह देखने के लिए जांच करता है कि क्या मौजूदा परत उस चेकसम के साथ उपलब्ध है और कॉन्फ़िगर चलाएं।

व्यक्तिगत फ़ाइल विवरण वापस पाने के लिए मैं देख सकता हूं कि एकमात्र तरीका गंतव्य फ़ाइल चेकसम को दोबारा बदलना होगा, जो संभवतः कैशिंग की गति को अधिकतर अस्वीकार कर देगा। यदि आप वैसे भी ऐसा करना चाहते हैं, तो दूसरी समस्या यह तय कर रही है कि किस परत को जांचना है। पिछली तुलनीय परत की सामग्री क्या थी, यह जानने के लिए आपको पिछले छवि निर्माण पेड़ (शायद टैग द्वारा?) देखना होगा। _Matching जाओ के filepath.Match नियमों का उपयोग किया जाता है:

+0

[Dockerfile संदर्भ] में (https://docs.docker.com/engine/reference/builder/#/dockerignore-file) यह है कि कहा गया है। एक प्रीप्रोकैसिंग चरण अग्रणी और पिछली सफेद जगह को हटा देता है और समाप्त करता है। और .. गो के फ़ाइलपाथ का उपयोग कर तत्व। क्लीन। प्रीप्रोकैसिंग के बाद रिक्त रेखाएं अनदेखा की जाती हैं ._ शायद सबसे अच्छा मैं उम्मीद कर सकता हूं कि फाइलों की एक सूची है जो _are_ माना जाता है। –

+0

ऐसा लगता है। पुनर्संरचना विचार संभव है, आपको शायद एक जाने वाली उपयोगिता लिखनी होगी जो बिल्ड संदर्भ बना सकती है और 'डॉकर बिल्ड' जैसे कैश की जांच कर सकती है (या केवल 'डॉकर बिल्ड' का विस्तार करें)। अंतिम परत कैश हिट होने के बाद परत आईडी मिलने तक इसे छवि परतों को पार करने के लिए पिछली छवि आईडी की एक और तर्क की आवश्यकता होगी। फिर आप उस परत आईडी के लिए [tarsum] (https://github.com/docker/docker/blob/1a14bbc61e35fd2ca412e07fa6c456095756f892/pkg/tarsum/tarsum.go) बना सकते हैं, जिसमें सभी फ़ाइलों के लिए हैश शामिल है और वर्तमान की तुलना में संदर्भ का निर्माण करें। प्रत्येक निर्माण संदर्भ के लिए – Matt

+0

'डॉकर बिल्ड' प्रतीत होता है [फ़ाइल जानकारी का हैश बनाए रखें] (https://github.com/docker/docker/blob/1a14bbc61e35fd2ca412e07fa6c456095756f892/builder/tarsum.go#L69)। – Matt

संबंधित मुद्दे

 संबंधित मुद्दे