डॉकर: पहले से बनाए गए कंटेनर में पुनरारंभ नीति जोड़ें


229

मैं देख रहा हूं कि डॉकटर ने कुछ रीस्टार्टिंग पॉलिसियों को कहा है, उदाहरण के लिए, रिबूट के मामले में कंटेनरों के पुनरारंभ को संभालने के लिए।

हालांकि यह बहुत उपयोगी है, मैं देखता हूं कि रीस्टार्ट पॉलिसी कमांड सिर्फ काम करती है docker runऔर नहीं docker start। तो मेरा सवाल है:

क्या अतीत में पहले से निर्मित कंटेनर में पुनः आरंभ करने की नीतियों को जोड़ने का कोई तरीका है?


आपको @ वायले हुआंग के एक के स्वीकृत उत्तर को बदलना चाहिए। स्वीकृत उत्तर docker के वर्तमान संस्करणों के साथ गलत है। मैं समझता हूं कि उत्तर ने आपकी मदद की होगी, लेकिन अब यह भ्रामक है।
चरण ववरा

2
किया हुआ। चेतावनी के लिए धन्यवाद।
एनरिक मोरेनो टेंट

जवाबों:


574

डॉक के हाल के संस्करणों में (1.11 तक) आपके पास एक updateकमांड है:

docker update --restart=always <container>

9
ऐसा लगता है कि यह डॉकर 1.11.0 में जोड़ा गया था।
फानसेन


4
कैवेट के साथ स्वीकृत उत्तर होना चाहिए कि यह डॉकर 1.11 के रूप में काम करता है।
जॉनडॉ

6
docker update --restart always <container> do.09
HarlemSquirrel

4
docker updateकई कंटेनर ID को स्वीकार करता है, इसलिए इसकी कोई आवश्यकता नहीं है xargs, बस करें docker update --restart=always $(docker ps -q)
जनक

49

RestartPolicy को संशोधित करने के लिए दो दृष्टिकोण हैं:

  • कंटेनर आईडी का पता लगाएं, पूरे डॉकटर सेवा को रोकें, /var/lib/docker/containers/CONTAINER_ID/hostconfig.json को संशोधित करें, RestartPolicy सेट करें -> "हमेशा" का नाम दें, और docker सेवा प्रारंभ करें।
  • docker commit एक नई छवि के रूप में आपका कंटेनर, वर्तमान कंटेनर को रोकें और rm करें, और छवि के साथ एक नया कंटेनर प्रारंभ करें।

2
कंटेनर को रोकें, संपादित करें, कंटेनर शुरू करें। एक जादू की तरह काम करता है। मुझे नहीं पता कि संपादन अक्षम क्यों है।
धुंध

2
अंत में, एक उचित उत्तर :)
नवीन

1.10 के साथ एक पुराने सर्वर पर मेरे लिए काम किया (😱 मत पूछो)। अफसोस की बात है कि docker updateकेवल 1.11+
इगोर कुप्स्कीस्की

1

--restart=alwaysरीबूट के मामले में पॉलिसी का उपयोग करने से मौजूदा कंटेनरों को फिर से शुरू किया जा सकेगा।

समस्या यह है कि यदि डॉकटर में चर्चा किए गए नए संस्करण की छवि को चलाने के साथ कई कंटेनर हैं - तो आप कंटेनर पर ऑटो-पुनरारंभ को कैसे अक्षम करते हैं? --restart=always

कंटेनर को स्वचालित रूप से हटाने की कोशिश करना, जब यह विकल्प docker run --rmसे मौजूद होता है, तो --restart=always नीति के साथ समस्या भी होगी क्योंकि वे एक-दूसरे से विवाद कर रहे हैं

$ docker run --rm --restart always <image>
Conflicting options: --restart and --rm

तो इस मामले में एक और विकल्प चुनना बेहतर है: - जब तक रोका नीति नहीं है।

$ docker run --rm --restart unless-stopped <image>

यह नीति परस्पर विरोधी नहीं होंगेdocker run --rm , लेकिन जैसा कि में विस्तार से बताया डोकर प्रलेखन :

यह उसी के समान है --restart=always, सिवाय इसके कि जब कंटेनर को रोक दिया जाता है (मैन्युअल रूप से या अन्यथा) , तो डॉकर डेमॉन के पुनरारंभ होने के बाद भी इसे फिर से शुरू नहीं किया जाता है।

इस --restart unless-stoppedनीति का उपयोग करते समय , यह सुनिश्चित करने के लिए कि टर्मिनल बंद करते समय दुर्घटना से रूकने की स्थिति में पुनरारंभ करना काम कर रहा है, नीचे दिए गए एक और बार में एक बार करें:

$ docker ps
$ docker restart <container>

पिछले शेल में हत्या की प्रक्रिया समाप्त होने तक प्रतीक्षा करें, फिर इसे बंद करें और बस छोड़ दें ( निकास न करें )।
और कंटेनर में अभी भी चल रहे टर्मिनल में फिर से जाँच करें:

$ docker ps

यदि यह अभी भी चल रहा है तो आप सुरक्षित रूप से रीबूट कर सकते हैं और फिर से जांच सकते हैं कि एप्लिकेशन पुनः आरंभ हो रहा है और देखें कि आपका डॉकटर कई कंटेनरों के उपयोग के बिना साफ है।

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