हमेशा ताजा छवियों से कंटेनरों को फिर से बनाने के लिए डॉक-कंपोज़ कैसे प्राप्त करें?


199

मेरे डॉकटर चित्र जेन्किन्स सीआई सर्वर पर बने हैं और हमारी निजी डोकर रजिस्ट्री में धकेल दिए गए हैं। मेरा लक्ष्य डॉकटर-कंपोज़ के साथ वातावरण का प्रावधान करना है जो हमेशा छवियों की मूल रूप से निर्मित स्थिति को शुरू करते हैं।

मैं वर्तमान में अलग-अलग मशीनों पर 1.3.2 के साथ-साथ 1.4.0 का उपयोग कर रहा हूं, लेकिन हमने पुराने संस्करणों का भी उपयोग किया है।

मैंने हमेशा docker-compose pull && docker-compose up -dरजिस्ट्री से ताजा छवियों को लाने और उन्हें शुरू करने के लिए आदेशों का उपयोग किया । मेरा मानना ​​है कि मेरा पसंदीदा व्यवहार एक निश्चित समय तक अपेक्षित था, लेकिन तब से docker-compose upहर बार मूल रूप से निर्मित छवियों को शुरू करने के बजाय पहले से बंद किए गए कंटेनरों को फिर से चलाना शुरू कर दिया।

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

ps। अपने लक्ष्य को प्राप्त करने का रास्ता खोजने के अलावा, मैं इस व्यवहार की पृष्ठभूमि के बारे में थोड़ा और जानना पसंद करूंगा। मुझे लगता है कि डॉकर का मूल विचार एक अपरिहार्य बुनियादी ढांचे का निर्माण करना है। डॉकटर-कम्पोज़ का वर्तमान व्यवहार इस दृष्टिकोण के साथ सादा टकराव लगता है .. या मुझे यहाँ कुछ बिंदु याद हैं?

जवाबों:


233

docker-compose up --force-recreateएक विकल्प है, लेकिन यदि आप इसे CI के लिए उपयोग कर रहे हैं, तो मैं docker-compose rm -fकंटेनरों और संस्करणों को रोकने और हटाने के लिए निर्माण शुरू करूंगा (फिर इसे पुल और अप के साथ पालन करूंगा )।

यही है वह जो मेरे द्वारा उपयोग किया जाता है:

docker-compose rm -f
docker-compose pull
docker-compose up --build -d
# Run some tests
./tests
docker-compose stop -t 1

जिस कारण से कंटेनर को फिर से बनाया जाता है, वह किसी भी डेटा वॉल्यूम को संरक्षित करने के लिए है जिसका उपयोग किया जा सकता है (और यह upबहुत तेजी से बनाने के लिए भी होता है )।

यदि आप CI कर रहे हैं तो आप ऐसा नहीं चाहते हैं, इसलिए बस सब कुछ हटा देना चाहिए जो आप चाहते हैं।

अद्यतन: उपयोग up --buildजो docker-compose1.7 में जोड़ा गया था


1
हाँ, वास्तव में यह वही है जो मैं सीआई में भी करता हूं। मुझे यकीन नहीं है कि मैंने इसका उल्लेख क्यों नहीं किया ...
एड्रियन मूट

@dnephin docker-compose run -dमौजूद नहीं है? आप कहना चाहते हैं docker-compose up -dना?
गुइल्यूम विंसेंट

2
यदि आप docker-compose pullइससे पहले कि docker-compose rm -fआप और भी अधिक समय बचा सकते हैं
स्टेफ़ानलिंडॉउर

2
अंत में डी-फ्लैग क्या है?
डेविड जे। डेविस


136

मेरे लिए काम करने वाला एकमात्र समाधान यह आदेश था:

docker-compose build --no-cache

यह स्वचालित रूप से रेपो से ताज़ा छवि खींच लेगा और उस कैश संस्करण का उपयोग नहीं करेगा जो आपके द्वारा पहले उपयोग किए जा रहे किसी भी पैरामीटर के साथ बनाया गया है।


1
इसके अलावा, विंडोज 10 के तहत डीएनएस सर्वर को सेटिंग्स में ऑटोमैटिक से फिक्स्ड या फिर फिक्स्ड से ऑटोमैटिक में सेट करने में मदद मिल सकती है।
qräbnö

2
मेरे लिए OS X बिल्डिंग पर docker-comopse वर्जन 2 के साथ काम किया।
RoboBear

1
OS X docker पर काम किया।
नमस्ते 13

55

वर्तमान आधिकारिक दस्तावेज़ीकरण द्वारा एक शॉर्ट कट होता है जो कंटेनर, नेटवर्क, वॉल्यूम और ऊपर की ओर बनाई गई छवियों को रोकता है और हटाता है, अगर वे पहले से ही बंद हो गए हैं या आंशिक रूप से हटा दिए गए हैं, तो यह चाल भी करेगा:

docker-compose down

फिर यदि आपकी छवियों या डॉकफ़ाइल्स पर नए परिवर्तन होते हैं:

docker-compose build --no-cache

आखिरकार:docker-compose up

एक आदेश में: docker-compose down && docker-compose build --no-cache && docker-compose up


2
docker-compose build --no-cacheजरूरत है तो केवल डॉकफाइल्स पर बदलाव की।
विक्टर टिमोफेटी

वास्तव में, विक्टर। धन्यवाद! मुझे लगा कि कंटेनर शुरू होने पर निष्पादित होने वाले मॉड्यूल / एप्लिकेशन को अपडेट करने के बाद भी यह आवश्यक था। इन मामलों के लिए, चलाने से पहले docker-compose up, सेवाओं के पुनर्निर्माण के लिए आवश्यक है docker-compose build
ivanleoncz

18

आप पास कर सकते हैं --force-recreateकरने के लिए docker compose upहै, जो ताजा कंटेनर का उपयोग करना चाहिए।

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

मुझे विश्वास नहीं है कि कोई भी तरीका है जिससे आप कम्पोज़ फ़ाइल से इसे बाध्य कर सकते हैं।

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


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

8
--force-recreateमेरे लिए काम ... छवि भी एक नए संस्करण वहाँ बाहर है, हालांकि खींच लिया है नहीं है नहीं ...
Lisak

1
@ लिसाक मैंने कभी नहीं कहा कि इसने नई छवियां खींची हैं। यह नहीं है यह सिर्फ नए कंटेनरों को शुरू करता है जो स्थानीय स्तर पर उपलब्ध छवि का उपयोग करते हैं। आपको मैन्युअल रूप से डॉक पुल चलाने की आवश्यकता होगी।
एड्रियन मौट

2
docker-compose up --build

या

docker-compose build --no-cache

1
जब संभव हो, कृपया केवल कोड के बजाय अतिरिक्त स्पष्टीकरण प्रदान करने का प्रयास करें। ऐसे उत्तर अधिक उपयोगी होते हैं क्योंकि वे समुदाय के सदस्यों की मदद करते हैं और विशेष रूप से नए डेवलपर्स समाधान के तर्क को बेहतर ढंग से समझते हैं, और अनुवर्ती प्रश्नों को संबोधित करने की आवश्यकता को रोकने में मदद कर सकते हैं।
राजन

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