एक छवि के स्वच्छ निर्माण के लिए डॉकर को कैसे मजबूर किया जाए


811

मैंने नीचे दिए गए कमांड का उपयोग करके एक डॉकर फ़ाइल से एक डॉकर छवि बनाई है।

$ docker build -t u12_core -f u12_core .

जब मैं इसे उसी कमांड के साथ पुनर्निर्माण करने की कोशिश कर रहा हूं, तो यह बिल्ड कैश का उपयोग कर रहा है:

Step 1 : FROM ubuntu:12.04
 ---> eb965dfb09d2
Step 2 : MAINTAINER Pavan Gupta <pavan.gupta@gmail.com>
 ---> Using cache
 ---> 4354ccf9dcd8
Step 3 : RUN apt-get update
 ---> Using cache
 ---> bcbca2fcf204
Step 4 : RUN apt-get install -y openjdk-7-jdk
 ---> Using cache
 ---> 103f1a261d44
Step 5 : RUN apt-get install -y openssh-server
 ---> Using cache
 ---> dde41f8d0904
Step 6 : RUN apt-get install -y git-core
 ---> Using cache
 ---> 9be002f08b6a
Step 7 : RUN apt-get install -y build-essential
 ---> Using cache
 ---> a752fd73a698
Step 8 : RUN apt-get install -y logrotate
 ---> Using cache
 ---> 93bca09b509d
Step 9 : RUN apt-get install -y lsb-release
 ---> Using cache
 ---> fd4d10cf18bc
Step 10 : RUN mkdir /var/run/sshd
 ---> Using cache
 ---> 63b4ecc39ff0
Step 11 : RUN echo 'root:root' | chpasswd
 ---> Using cache
 ---> 9532e31518a6
Step 12 : RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
 ---> Using cache
 ---> 47d1660bd544
Step 13 : RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
 ---> Using cache
 ---> d1f97f1c52f7
Step 14 : RUN wget -O aerospike.tgz 'http://aerospike.com/download/server/latest/artifact/ubuntu12'
 ---> Using cache
 ---> bd7dde7a98b9
Step 15 : RUN tar -xvf aerospike.tgz
 ---> Using cache
 ---> 54adaa09921f
Step 16 : RUN dpkg -i aerospike-server-community-*/*.deb
 ---> Using cache
 ---> 11aba013eea5
Step 17 : EXPOSE 22 3000 3001 3002 3003
 ---> Using cache
 ---> e33aaa78a931
Step 18 : CMD /usr/sbin/sshd -D
 ---> Using cache
 ---> 25f5fe70fa84
Successfully built 25f5fe70fa84

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


10
एक तरफ के रूप में, आपको आमतौर पर RUNनिर्देशों की संख्या को कम करने की कोशिश करनी चाहिए ।
ट्रिपल

4
@tripleee आप समझा सकते हैं क्यों?
हां।

9
@Ya। यह हुआ करता था कि डॉकटर ने हमेशा प्रत्येक RUNनिर्देशन के लिए एक अलग परत बनाई थी , इसलिए Dockerfileकई RUNनिर्देशों के साथ डिस्क स्थान की जिन्न मात्रा का उपभोग करेगा; लेकिन यह हाल के संस्करणों में कुछ हद तक सुधार हुआ है।
ट्रिपलए

जब मैं कोशिश करता हूं docker-compose up -d, तो मैं कहां उपयोग कर सकता हूं --no-cache?
ओओ

@ ऐसा संभव नहीं है। आपको पहले करना होगा docker-compose build --no-cacheऔर फिरdocker-compose up -d
मार्टिन मेल्का

जवाबों:


1437

एक --no-cacheविकल्प है:

docker build --no-cache -t u12_core -f u12_core .

डॉकर के पुराने संस्करणों में आपको पास करने की आवश्यकता थी --no-cache=true, लेकिन अब ऐसा नहीं है।


87
यह भी ध्यान दें कि --no-cacheसाथ काम करता है docker-compose build
12

42
तुम भी उपयोग करना चाहते हो सकता है --pull। यह आधार छवि का नवीनतम संस्करण प्राप्त करने के लिए docker को बताएगा। यह आवश्यक है इसके अलावा --no-cacheअगर आपके पास पहले से आधार छवि है (उदा:) ubuntu/latestऔर आधार छवि को अपडेट किया गया है क्योंकि आपने इसे पिछली बार खींचा था। यहां डॉक्स देखें ।
कॉलिन क्रॉल

2
@CollinKrawll: --pullविकल्प ने मेरे लिए चाल चली । बस --no-cache, निर्माण अभी भी टूट गया। के --pullरूप में अच्छी तरह से रखो , निर्माण काम! धन्यवाद!
एर्दो-बेकन

1
अगर कोई docker build कह रहा है तो क्या यह नहीं माना जाता है कि वे कैश के बिना पुनर्निर्माण करना चाहते हैं? किस उपयोग के मामले में कोई व्यक्ति एक छवि बनाना और पहले से निर्मित छवि का उपयोग करना चाहेगा? <rant> मैं सिर्फ एक दिन खो दिया है क्योंकि एक पहले का निर्माण चुपचाप अभी तक "सफल" पूरा नहीं हुआ है और मैं टूटी हुई छवि का उपयोग नहीं कर रहा था, यह समझ में नहीं आ रहा था कि बिल्ड स्क्रिप्ट में अपडेट क्यों काम नहीं कर रहा है </ rant>
Jeff

3
@ जेफ़ जब आप एक डॉक छवि विकसित कर रहे हैं, तो डॉक बिल्ड केवल उन परतों / चरणों को पुनर्निर्मित करेगा जिन्हें संशोधित किया गया है। यदि मेरे पास पाँच चरण हैं, और मैं इंडेक्स 3 में एक नया चरण जोड़ता हूं, तो चरण 1 और 2 से जुड़ी परतें फिर से उपयोग की जा सकती हैं। यह बहुत विकास की प्रक्रिया को गति देता है
फ्लेक्स

129

कुछ चरम मामलों में, आवर्ती बिल्ड विफलताओं के आसपास आपका एकमात्र तरीका चल रहा है:

docker system prune

कमांड आपकी पुष्टि के लिए आपसे पूछेगा:

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all networks not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N]

यह निश्चित रूप से सवाल का सीधा जवाब नहीं है, लेकिन कुछ लोगों की जान बचा सकता है ... इसने मुझे बचाया।


8
जोड़ना -a -f इसे बेहतर बनाता है
रवि

1
@ इयूलियनऑनफ्रेई मेरे लिए काम करता है,Docker version 17.09.0-ce, build afdb6d4
प्रति

1
@PerLundberg, मैंने dockerउसी संस्करण में अपडेट किया और यह काम करता है, धन्यवाद।
इयूलियन ओनोफ्रेई

1
यदि आप सब कुछ हटाना नहीं चाहते हैं तो इस परिदृश्य के लिए यह ओवरकिल है और प्रयोग करने योग्य उत्तर नहीं है।
M_dk

1
यह भी बंद कंटेनरों की छवियों को हटा देगा, शायद कुछ ऐसा जो आप नहीं चाहते हैं। docker builder pruneकैश्ड बिल्ड लेयर्स को साफ़ करने के लिए docker के हाल के संस्करणों में कमांड है। स्टैक ओवरफ्लो से कमांड को नेत्रहीन कॉपी करने के बाद बस जाल में गिर गई।
ईविल अजरेल

59

कमांड docker build --no-cache .ने हमारी समान समस्या को हल किया।

हमारी डॉकरीफाइल थी:

RUN apt-get update
RUN apt-get -y install php5-fpm

लेकिन होना चाहिए था:

RUN apt-get update && apt-get -y install php5-fpm

अद्यतन को कैशिंग को रोकने और अलग से स्थापित करने के लिए।

देखें: Dockerfiles लिखने के लिए सर्वोत्तम अभ्यास


10
"होना चाहिए था" भ्रामक है। अगर डॉकर यह देखता है कि आपके पास उसकी एक कैश्ड कॉपी है, RUN apt-get update && apt-get -y install php5-fpmतब भी वह पुरानी सामग्री के साथ पुन: उपयोग होता हुआ देखेगा।
ट्रिपल

10
वास्तव में यह अभी भी उनके साथ जुड़ने के लिए समझ में आता है, क्योंकि अन्यथा यदि आप इंस्टॉलेशन लाइन को बदलते हैं, तो यह अभी भी पुराने पैकेज कैश का उपयोग करेगा, जिसमें अक्सर समस्या होगी यदि कैश पुराना है (आमतौर पर, फाइलें 404 होगी।)
जॉन चाडविक

18

यह सुनिश्चित करने के लिए कि आपका निर्माण पूरी तरह से पुनर्निर्मित है, जिसमें अपडेट के लिए आधार छवि की जांच करना शामिल है, निर्माण के समय निम्नलिखित विकल्पों का उपयोग करें:

--no-cache - यह पहले से उपलब्ध परतों के पुनर्निर्माण को मजबूर करेगा

--pull - यह आपको नवीनतम संस्करण प्राप्त करने से सुनिश्चित करने के लिए संदर्भित आधार छवि के एक पुल को ट्रिगर करेगा।

इसलिए पूरी कमांड इस तरह दिखाई देगी:

docker build --pull --no-cache --tag myimage:version .

डॉक-कंपोज़ के लिए समान विकल्प उपलब्ध हैं:

docker-compose build --no-cache --pull

13

मैं --no-cacheआपके मामले में उपयोग करने की सलाह नहीं दूंगा ।

आप चरण 3 से 9 तक कुछ इंस्टॉलेशन चला रहे हैं (वैसे, मैं एक लाइनर का उपयोग करना पसंद करूंगा) और यदि आप नहीं चाहते कि इन चरणों का ओवरहेड हर बार जब आप अपनी छवि बना रहे हों Dockerfileअपने wgetनिर्देश से पहले एक अस्थायी कदम के साथ संशोधित करें ।

मैं कुछ ऐसा करने के लिए उपयोग करता हूं RUN ls .और इसे RUN ls ./तब तक बदलने के लिए RUN ls ./.और इसके द्वारा पुनर्प्राप्त तारबॉल पर किए गए प्रत्येक संशोधन के लिएwget

आप निश्चित रूप RUN echo 'test1' > test && rm testसे संख्या में वृद्धि की तरह कुछ कर सकते हैं'test1 प्रत्येक पुनरावृत्ति के लिए ।

यह गंदा दिखता है, लेकिन जहां तक ​​मुझे पता है कि यह डॉकटर के कैश सिस्टम से लाभ जारी रखने का सबसे कुशल तरीका है, जो कई परतों के होने पर समय बचाता है ...


3
एक निश्चित बिंदु के बाद कैश का उपयोग नहीं कर पाने की क्षमता कई लोगों द्वारा अनुरोधित एक विशेषता है (देखें कैश
बस्टिंग के

13

डॉकटर-कंपोज के साथ प्रयास करें docker-compose up -d --build --force-recreate


5

यहां ज्यादातर जानकारी सही है।
यहाँ उनका और मेरे उपयोग करने के तरीके का संकलन है।

यह सुझाव है कि अनुशंसित दृष्टिकोण (अन्य संग्रहीत डॉकटर ऑब्जेक्ट्स पर विशिष्ट और कोई प्रभाव न डालें) और अधिक कट्टरपंथी दृष्टिकोण (अन्य संग्रहीत डॉकटर ऑब्जेक्ट्स पर प्रभाव का निर्माण न करें) का प्रयास करने के लिए है जब यह पर्याप्त नहीं है।

अनुशंसित दृष्टिकोण:

1) डॉकरफाइल में प्रत्येक चरण / निर्देश के निष्पादन को बल:

docker build --no-cache 

या साथ docker-compose build:

docker-compose build --no-cache

हम उस upसब-कमांड को भी जोड़ सकते हैं जो सभी कंटेनरों को फिर से बनाता है:

docker-compose build --no-cache &&
docker-compose up -d --force-recreate 

ये तरीका कैश का उपयोग नहीं करते हैं, लेकिन डॉक बिल्डर और आधार छवि के लिए संदर्भित हैं FROM अनुदेश के ।

2) Docker बिल्डर कैश को पोंछें (यदि हम Buildkit का उपयोग करते हैं तो हमें शायद इसकी आवश्यकता है):

docker builder prune -af

3) यदि हम मूल चित्रों के कैश का उपयोग नहीं करना चाहते हैं, तो हम उन्हें हटाने की कोशिश कर सकते हैं जैसे:

docker image rm -f fooParentImage

ज्यादातर मामलों में, ये 3 चीजें पूरी तरह से हमारी छवि को साफ करने की अनुमति देने के लिए पर्याप्त हैं।
इसलिए हमें उस पर टिकने की कोशिश करनी चाहिए।

अधिक कट्टरपंथी दृष्टिकोण:

कोने के मामलों में जहां ऐसा लगता है कि डॉक कैश में कुछ वस्तुओं का उपयोग अभी भी निर्माण के दौरान किया जाता है और यह दोहरावदार दिखता है, हमें इस कारण को समझने की कोशिश करनी चाहिए कि लापता भाग को विशेष रूप से पोंछने में सक्षम होना चाहिए। यदि हमें वास्तव में खरोंच से पुनर्निर्माण का कोई रास्ता नहीं मिलता है, तो अन्य तरीके भी हैं लेकिन यह याद रखना महत्वपूर्ण है कि ये आम तौर पर आवश्यकता से अधिक हटाते हैं। इसलिए जब हम स्थानीय / देव वातावरण में नहीं होते हैं, तो हमें उन्हें सावधानी के साथ उपयोग करना चाहिए।

1) कम से कम एक कंटेनर से जुड़े बिना सभी छवियों को निकालें:

docker image prune -a

2) कई और चीजें निकालें:

docker system prune -a

वह कहता है :

चेतावनी! यह हटा देगा:
  - सभी ने कंटेनर को रोक दिया
  - सभी नेटवर्क कम से कम एक कंटेनर द्वारा उपयोग नहीं किए जाते हैं
  - कम से कम एक कंटेनर के बिना उनसे जुड़ी सभी छवियां
  - सभी कैश का निर्माण करते हैं

उस सुपर डिलीट कमांड का उपयोग करना पर्याप्त नहीं हो सकता है क्योंकि यह दृढ़ता से कंटेनरों की स्थिति पर निर्भर करता है (चल रहा है या नहीं)। जब वह कमांड पर्याप्त नहीं है, तो मैं ध्यान से सोचने की कोशिश करता हूं कि कौन से डॉकटर कंटेनर हमारे डॉकटर निर्माण के लिए साइड इफेक्ट्स का कारण बन सकते हैं और इन कंटेनरों को आदेश के साथ निकालने की अनुमति देने के लिए बाहर निकलने की अनुमति देते हैं।


3

आप बिल्डर कैश का प्रबंधन कर सकते हैं docker builder

बिना किसी संकेत के सभी कैश को साफ करने के लिए: docker builder prune -af

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