मैं कंटेनर ऑटो-डिलीट के साथ अपने डॉकर कंटेनरों को स्वचालित रूप से कैसे पुनरारंभ कर सकता हूं?

मेरे पास एक सामान्य उद्देश्य वीपीएस है, और मैं इस पर ऐप्स को डॉक कर रहा हूं । इस पर लगभग 5-6 कंटेनर होंगे, और बहुत कम, इसलिए बॉक्स को आवश्यकतानुसार तुच्छ रूप से फिर से बनाया जा सकता है ।

प्रत्येक ऐप के लिए मेरे पास एक स्टार्ट स्क्रिप्ट है । एक वर्डप्रेस कंटेनर इस तरह दिखता है:

#!/bin/bash# Get the host IP addressexport DOCKER_HOSTIP=`ifconfig docker0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1`echo "Connecting to database on Docker host ${DOCKER_HOSTIP}"docker run \    --add-host=docker:${DOCKER_HOSTIP} \    --network dockernet \    --network-alias jonblog \    --detach \    --restart always \    --rm \    jonblog

हालाँकि, यह एक त्रुटि देता है:

परस्पर विरोधी विकल्प: -- पुनः आरंभ करें तथा -- आरएम

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

तो, मैंने सोचा कि मैं ड्रॉप चाहिए --restart ध्वज, और फिर डॉकर कंटेनरों को रोकने और शुरू करने के लिए एक प्रक्रिया प्रबंधक का उपयोग करें । क्या मैं यहां मोनिट का उपयोग कर सकता हूं? मैं कुछ ऐसा करने की उम्मीद कर रहा था:

CHECK PROCESS jonblog MATCHING jonblog  START PROGRAM = "/root/docker/jonblog/host-start.sh"  STOP PROGRAM = "docker stop jon-blog"

हालांकि, यह सिस्टम प्रक्रिया तालिका की जांच करता है, और नहीं docker ps, और इसलिए यह निर्दिष्ट स्ट्रिंग से मेल खाने वाला कुछ नहीं मिलेगा। क्या मैं इसे निष्पादित कर सकता हूं docker ps समय-समय पर, और आउटपुट में लाइनों का मिलान करें?

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

स्पष्टीकरण --rm

कारण है कि मैं चाहता हूँ --rm क्या यह डॉकराइजेशन प्रक्रिया के दौरान, मैं वर्तमान में चल रहे कंटेनर को रोक देता हूं, load छवि का एक नया संस्करण, और उपरोक्त स्क्रिप्ट को फिर से चलाएं । इसका मतलब है कि डॉकर को एक की सूचना दी जा रही है restart प्रत्येक कंटेनर के लिए नीति। मैंने पाया कि बॉक्स को रिबूट करने के बाद, मेरे पास एक साथ चलने वाले ऐप के 15 या उससे थोड़ा-अलग संस्करण होंगे, जो कि इरादा नहीं है ।

मुझे लगता है मैं इस्तेमाल कर सकता docker update --restart never पर पुराने कंटेनरों को रोकने के लिए यह हो रहा है, लेकिन तब जब मेरे कंटेनर बंद हो जाता है, मैं कर रहा हूँ के साथ छोड़ दिया है, यह चारों ओर झूठ बोल रही है, और मैं बस के रूप में जल्द ही है, यह ऑटो-हटाएं । मैं समय-समय पर पुराने लोगों को किसी प्रकार की क्रॉन नौकरी का उपयोग करके साफ कर सकता था, लेकिन यह थोड़ा हैकी लगता है कि डॉकर मेरे लिए यह कर सकता है ।

जवाब की एक श्रृंखला की मांग

एक बहुत ही उपयोगी टिप्पणी ने सुझाव दिया है कि मुझे मिनीक्यूब में देखना चाहिए, जो स्पष्ट रूप से कुबेरनेट्स के सेटअप को सरल बनाता है, यहां तक कि एक उपयुक्त कुशल व्यक्ति पांच मिनट में ऊपर और चल सकता है ।

मैं अभी भी अधिक हल्के समाधान प्रस्तावित देखना चाहूंगा, इसलिए मेरे पास चुनने के लिए कई उत्तर हैं । जैसा कि संकेत दिया गया है, मैं इसका उत्तर जानना चाहूंगा कि क्या मोनिट जैसी प्रक्रिया पर्यवेक्षक काम करेगी ।

मेरे सिर के ऊपर से, मैं लिखने के लिए एक शेल लूप लिख सकता था docker ps एक मिनट के लिए हर पांच सेकंड में एक फ़ाइल के लिए, और फिर हर मिनट एक क्रॉन पर चलाएं । मैं तब उस फ़ाइल का उपयोग करके स्कैन कर सकता था grep और Monit CHECK PROGRAM सिस्टम चेक। यह थोड़ा हैकी है, लेकिन कुछ ऐसा है जिसे मैं आसानी से समझ सकता हूं अगर इसमें कोई समस्या है । उस सुझाव पर कोई प्रगति?

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

इस प्रकार, मैं एक सरल फैशन में इस समस्या को हल करने के लिए निकल पड़ा । मेरे पास दो विकल्प थे:

  1. डॉकर में कंटेनर ऑटो-डिलीट सुविधा का उपयोग करें, और अपना स्वयं का पुनरारंभ सिस्टम सेट करें
  2. डॉकर पुनरारंभ नीति का उपयोग करें, और अपना स्वयं का कंटेनर विलोपन सिस्टम सेट करें

मैंने इनमें से पहले पर शुरू किया, इस विचार के साथ कि प्रक्रिया पर्यवेक्षक मोनिट का उपयोग करना अच्छा होगा, आंशिक रूप से क्योंकि यह हल्का है, और आंशिक रूप से क्योंकि मैं इससे परिचित हूं । हालांकि, यह गलत समाधान की तरह महसूस करना शुरू कर दिया, क्योंकि मैं मुख्य समस्या के आसपास काम कर रहा हूं कि यह सफाई से डॉकर कंटेनर प्रक्रिया सूची प्राप्त नहीं कर सकता है ।

वास्तव में, दूसरा विकल्प बहुत साफ था, और यह इस तथ्य से बढ़ गया था कि कंटेनर को साफ करना वास्तव में प्राथमिकता नहीं है-यह सिर्फ चीजों को साफ रखने के लिए है । बेशक, मैंने इसके लिए डॉकर का इस्तेमाल किया; यहाँ है Dockerfile:

# Docker build script for Docker TidyFROM alpine:3.6RUN apk updateRUN apk add docker# See this for BusyBox cron schedules# https://gist.github.com/andyshinn/3ae01fa13cb64c9d36e7COPY bin/docker-tidy.sh /etc/periodic/daily/RUN chmod +x /etc/periodic/daily/docker-tidy.sh# Start Cron in the foregroundENTRYPOINT ["crond", "-l", "2", "-f"]

और यहाँ है bin/docker-tidy.sh:

#!/bin/sh## With thanks to:# http://www.doublecloud.org/2015/05/simple-script-to-list-and-remove-all-stopped-docker-containers/docker rm -v $(docker ps -a -q -f status=exited)

अंत में, मेरे समाधान के साथ एक दोष यह है कि यदि होस्ट को एक बंद कंटेनर सफाई से पहले रिबूट किया जाता है, तो वे कंटेनर भी पुनरारंभ होते हैं । इसलिए मैं नए शुरू करने से पहले उन कंटेनरों पर पुनरारंभ नीति को रीसेट करता हूं ।

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

#!/bin/bash# Removes the restart policy from previous containersCONTAINER_LABEL=docker-tidy-instancedocker ps --all --filter label=$CONTAINER_LABEL --quiet | xargs --no-run-if-empty docker update --restart nodocker run \    --label $CONTAINER_LABEL \    --volume /var/run/docker.sock:/var/run/docker.sock \    --detach \    --restart always \    docker-tidy

मिनीक्यूब के साथ खेलें आप इसे लगभग पांच मिनट में प्राप्त कर सकते हैं ।

काफी उचित, @माइकल । क्या मैं मोनिट के साथ ऐसा कर सकता हूं (इस आधार पर मैं इससे कुछ परिचित हूं)? मैंने देखा [मैन पेज पर] (monit(1) - Linux man page), लेकिन यह एक पढ़ने का एक राक्षस है, और मैंने उस के माध्यम से जीवित रहने की इच्छा खो दी । मुझे आश्चर्य है कि, डॉक्स से, क्या [प्रोग्राम चेक] (Monit Manual) काम करेगा-अगर मैं निष्पादन योग्य पथ में एक पैरामीटर को चुपके कर सकता हूं, तो यह नामित कंटेनर चल रहा है या नहीं, इसके आधार पर सफलता/असफल हो सकता है ।

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

ईमानदारी से यदि आप अक्सर कंटेनरों का पुनर्निर्माण कर रहे हैं, तो आपको चीजों को प्रबंधित करने के लिए कुबेरनेट्स जैसी किसी चीज़ का उपयोग करना चाहिए ।

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

(पांच मिनट पहले यहां एक टिप्पणी, जिसे अब हटा दिया गया है, ने कहा कि मुझे बस पुनरारंभकी आवश्यकता है । हां, यह काम करेगा, लेकिन फिर मुझे - आरएम को छोड़ना होगा-मेरे पास एक या दूसरा हो सकता है, लेकिन दोनों नहीं, मैंने प्रश्न में दिखाई गई त्रुटि को देखते हुए । स्पष्टीकरण संपादित करें कि मुझे क्यों लगता है कि --आरएम की आवश्यकता है) ।

जब आप कंटेनर को पुनरारंभ करना चाहते हैं और जब आप कंटेनर को हटाना चाहते हैं तो परिस्थितियों के बीच अंतर करने का कोई अच्छा तरीका नहीं है । यह कुछ ऐसा है जिसे आपको डॉकर के बाहर खुद को संभालने की जरूरत है ।