विशिष्ट RUN कमांड के लिए कैश अक्षम करें


101

RUNमेरी डॉकरीफाइल में कुछ कमांड्स हैं -no-cacheजिन्हें मैं हर बार चलाने के साथ - साथ एक डॉकर इमेज बनाना चाहता हूं।

मैं समझता हूं docker build --no-cacheकि पूरे डॉकरीफाइल के लिए कैशिंग अक्षम हो जाएगा।

क्या विशिष्ट RUN कमांड के लिए कैश को अक्षम करना संभव है?


1
एक बार जब आप किसी एकल कमांड के लिए कैश को अक्षम कर देते हैं, यदि परिणाम पिछले कैश्ड रन से मेल नहीं खाता है, तो आपको शेष सभी चरणों का पुनर्निर्माण करना होगा। क्या यह आपका लक्ष्य है, या क्या आप केवल एक ही परत के पुनर्निर्माण की उम्मीद करते हैं और किसी भी तरह से इसे इंजेक्ट करते हैं जहां पूर्व कैश्ड डेटा संग्रहीत किया गया था?
BMitch

2
मैं विशिष्ट परतों के पुनर्निर्माण की उम्मीद कर रहा था, उदाहरण के लिए "गिट पुल" कमांड। अभी "गिट पुल" कमांड को कैश किया जाएगा, भले ही रेपो अपडेट किया गया हो।
विन्गोफ्ट

2
एक अप्रयुक्त तर्क को पारित करके एक पुल को मजबूर करना काफी आसान है। लेकिन उस कैश्ड प्रविष्टि के पुनर्निर्माण का परिणाम यह है कि सभी निम्नलिखित परतों को पुनर्निर्माण की आवश्यकता होगी। एक उदाहरण के लिए मेरा जवाब यहां देखें ।
BMitch

अगर एक गीट रिमोट बदल गया है तो कैश को अमान्य करने के लिए देख रहे हैं: डॉकरफाइल कैचिंग क्लोन को कैसे रोकें । लिंक्ड जवाब के लिए @anq को सभी क्रेडिट ।
hpgmiskin

जवाबों:


82

जिस क्षेत्र के लिए आप कैश को निष्क्रिय करना चाहते हैं, उससे पहले हमेशा कुछ अर्थहीन और सस्ते-से-कमांड चलाने का विकल्प होता है।

जैसा कि इस समस्या टिप्पणी में प्रस्तावित है , एक बिल्ड लॉजिक ब्लॉक जोड़ सकता है (नाम मनमाना हो सकता है):

ARG CACHEBUST=1 

इस तरह के क्षेत्र से पहले, और प्रत्येक रन --build-arg CACHEBUST=$(date +%s)को एक docker buildतर्क के रूप में जोड़कर उसके मूल्य को संशोधित करें (मूल्य भी मनमाना हो सकता है, यहां यह वर्तमान डेटाटाइम है, रन भर में इसकी विशिष्टता सुनिश्चित करने के लिए)।

यह निश्चित रूप से, सभी निम्नलिखित ब्लॉकों के लिए भी कैश को अक्षम कर देगा, क्योंकि मध्यवर्ती छवि का हैश योग अलग होगा, जो वास्तव में चयनात्मक कैश को गैर-तुच्छ समस्या को अक्षम करता है, यह ध्यान में रखते हुए कि वर्तमान में कैसे काम करता है।


1
अब काम करने के लिए प्रतीत नहीं होता है, बस ---> Using cacheमेरे `` एआरजी CACHEBUST = 1` लाइन के तहत मिला ... (और हाँ मैंने --build-arg CACHEBUST=$(date +%s)अपने
डॉक

मेरे लिए भी काम नहीं करता है, शायद यह मंच पर निर्भर है। मैंने कैश को अमान्य करने के लिए किसी भी एआरजी परिवर्तन की अपेक्षा की होगी।
ओलिवर

6
आपको जोड़ने के RUN echo "$CACHEBUST"रूप में बस का उपयोग कर ARGकैश को अमान्य नहीं करेगा
सिद्धार्थ वी

इस जवाब ने मेरी समस्या हल कर दी: stackoverflow.com/questions/63709147/…
आकारिरो याकोव

28

उपयोग

ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache

RUN लाइन से पहले आप हमेशा चलना चाहते हैं। यह काम करता है क्योंकि ADD हमेशा फ़ाइल / URL लाएगा और उपरोक्त URL प्रत्येक अनुरोध पर यादृच्छिक डेटा उत्पन्न करता है, फिर डॉकटर परिणाम की तुलना यह देखने के लिए करता है कि क्या यह कैश का उपयोग कर सकता है।

मैंने इसका परीक्षण भी किया है और अच्छी तरह से काम करता है क्योंकि इसके लिए किसी अतिरिक्त डॉकर कमांड लाइन के तर्कों की आवश्यकता नहीं होती है और डॉकटर-कंपोज.माइल फ़ाइल से भी काम करता है :)


3
क्या हो रहा है अगर random.org उस समापन बिंदु को बदलने का फैसला करता है? आप उस व्यवहार को कैसे नियंत्रित करेंगे?
एंड्रेस लियोन रंगेल

@AndresLeonRangel यह पूरी तरह से एक डॉक फ़ीचर नहीं है, लेकिन डॉक सिंटैक्स और जाने-माने वेब सेवा का उपयोग करने वाली एक हैक की तरह है जो लगभग 20+ वर्षों से है, हालांकि आप यह कहने में सही हैं कि वे उस समापन बिंदु को चित्रित कर सकते हैं, वास्तव में अब उनके डॉक्स को देख रहे हैं। मुझे "रैंडबाइट" समापन बिंदु भी नहीं मिल रहा है और उनके पास वर्तमान में बीटा में एक नया एपीआई है। आप या तो 1) जब तक यह विफल रहता है, 2) इस अंतिम बिंदु का उपयोग करने के लिए अपने नए अंत बिंदु (जब तक यह विफल रहता है 3 का उपयोग करें) या) अपनी यादृच्छिक endpoint जिस स्थिति में आप पूरा नियंत्रण होता है लिखने :) जारी रख सकते हैं
स्टीव

3
यह कुछ समय विफल रहा ... जब साइट नीचे है !!! मुझे लगता है कि यह इसके लिए सही समाधान नहीं है। ADD विफल: यादृच्छिक प्राप्त करने में असफल रहा ।.org/cgi-bin/randbyte?nbytes=10&format=h स्टेटस 503 के साथ सेवा अनुपलब्ध: <! DOCTYPE HTML>
Kathi

1
random.org ने DDOS सुरक्षा जोड़ी है जो अब इस समाधान को तोड़ती है
ब्रैड रूट

यह काम नहीं करता है और इसमें दिए गए परिशिष्ट 503 दिए गए हैं। यदि आप अपनी पाइपलाइनों को अवरुद्ध नहीं करना चाहते हैं तो इस घोल का उपयोग न करें
ओलेगिन

9

सीधे नहीं, लेकिन आप अपनी डॉकरीफाइल को कई हिस्सों में विभाजित कर सकते हैं, एक छवि बना सकते हैं, फिर अगले डॉकटरफाइल की शुरुआत में इस के साथ, और कैशिंग के साथ या बिना छवि का निर्माण कर सकते हैं


1
क्या यह आधार डॉकटर इमेज में कमिटेड लेयर को अपडेट करने में सक्षम होगा?
user_mda

7

फरवरी 2016 तक यह संभव नहीं है।

GitHub में सुविधा का अनुरोध किया गया है



0

मेरा मानना ​​है कि यह @ स्टीव के उत्तर पर थोड़ा सुधार है, ऊपर:

RUN git clone https://sdk.ghwl;erjnv;wekrv;qlk@gitlab.com/your_name/your_repository.git

WORKDIR your_repository

# Calls for a random number to break the cahing of the git clone
# (/programming/35134713/disable-cache-for-specific-run-commands/58801213#58801213)
ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache
RUN git pull

यह git क्लोन के Docker कैश का उपयोग करता है, लेकिन फिर रिपॉजिटरी का अनकैप्ड अपडेट चलाता है।

यह काम करने के लिए प्रकट होता है, और यह तेज है - लेकिन अंतर्निहित सिद्धांतों को प्रदान करने के लिए @steve के लिए बहुत धन्यवाद।


-2

एक और त्वरित हैक आपके आदेश से पहले कुछ यादृच्छिक बाइट्स लिखना है

RUN head -c 5 /dev/random > random_bytes && <run your command>

5 यादृच्छिक बाइट्स लिखता है जो कैश मिस को मजबूर करेगा


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