कुछ आदेश जैसे up -d service_name या start service_name तुरंत लौट रहे हैं और यह बहुत उपयोगी है यदि आप नहीं चाहते कि कंटेनर शेल की स्थिति पर निर्भर रहें, जैसे वे नियमित रूप से करते हैं up service_name. एक उपयोग-मामला इसे किसी प्रकार के निरंतर एकीकरण/वितरण सर्वर से चला रहा है ।
लेकिन सेवाओं को चलाने/शुरू करने का यह तरीका बाद में सेवा की वास्तविक स्थिति के बारे में कोई प्रतिक्रिया नहीं देता है ।
मुझे एक समान आवश्यकता थी । हालांकि, मेरे पास एक है restart: always मेरे वातावरण में । तो यह पता लगाना थोड़ा मुश्किल हो सकता है कि क्या कुछ दुर्घटनाग्रस्त हो रहा है और लूप में पुनरारंभ हो रहा है ।
मैंने बनाए गए और प्रारंभ समय की तुलना करने के लिए एक आइसिंगा/नागियोस चेक बनाया । शायद यह लाइन के नीचे किसी और के लिए उपयोगी है:
#!/usr/bin/env pythonfrom __future__ import print_functionimport argparsefrom datetime import timedeltafrom datetime import datetimeimport sysfrom dateutil.parser import parse as parse_dateimport dockerimport pytzparser = argparse.ArgumentParser()parser.add_argument("compose_project", help="The name of the docker-compose project")parser.add_argument("compose_service", help="The name of the docker-compose service")args = vars(parser.parse_args())client = docker.from_env()service_containers = client.containers.list(filters={ "label": [ "com.docker.compose.oneoff=False", "com.docker.compose.project={}".format(args["compose_project"]), "com.docker.compose.service={}".format(args["compose_service"]) ]})if len(service_containers) == 0: print("CRITICAL: project({})/service({}) doesn't exist!".format( args["compose_project"], args["compose_service"])) sys.exit(2)elif len(service_containers) > 1: print("CRITICAL: project({})/service({}) has more than 1 " "container!".format( args["compose_project"], args["compose_service"])) sys.exit(2)service_container = service_containers[0]created_at = parse_date(service_container.attrs['Created'])status = service_container.attrs['State']['Status']started_at = parse_date(service_container.attrs['State']['StartedAt'])now = datetime.utcnow().replace(tzinfo=pytz.utc)uptime = now - started_atif status in ['stopped', 'exited', 'dead']: print("CRITICAL: project({})/service({}) is status={}".format( args["compose_project"], args["compose_service"], status)) sys.exit(2)if (started_at - created_at) > timedelta(minutes=5): if uptime < timedelta(seconds=5): print("CRITICAL: project({})/service({}) appears to be " "crash-looping".format( args["compose_project"], args["compose_service"])) sys.exit(2)if status == "restarting": print("WARNING: project({})/service({}) is restarting".format( args["compose_project"], args["compose_service"])) sys.exit(1)print ("OK: project({})/service({}) is up for {}".format( args["compose_project"], args["compose_service"], uptime))sys.exit(0)
यह केवल डॉकर कंटेनर की स्थिति लौट रहा है । यदि आप अपने आवेदन की वास्तविक स्थिति की जांच करना चाहते हैं तो आपको अपने डॉकरफाइल में हेल्थचेक जोड़ना चाहिए (https://docs.docker.com/engine/reference/builder/#healthcheck). बाद में आप इसके साथ निरीक्षण कर सकते हैं:
कंटेनर या तो अनिश्चित काल तक शुरू होते हैं और चलते हैं या त्रुटि कोड के साथ तुरंत बंद हो जाते हैं (यानी लापता कॉन्फ़िगरेशन के लिए)
डॉकर-कंपोज़ अप-डी रिटर्न के बाद आप केवल एक बार चेक करते हैं
आप जांच सकते हैं कि किसी त्रुटि के कारण कोई रोका गया कंटेनर है या नहीं:docker ps -a | grep 'Exited (255)'.
यह चेक उन कंटेनरों के मामले में भी सही ढंग से काम करता है, जिनके बिना किसी त्रुटि (यानी डेटा कंटेनर) के साथ तुरंत बंद होने की उम्मीद है, उनकी स्थिति के रूप में (से docker ps -a) के रूप में चिह्नित है Exited (0).
उदाहरण के लिए, हमारे डॉकर-रचना में । वाईएमएल, हम अपने कंटेनरों को शुरू करते हैं:
आप के लिए ग्रेप कर सकते हैं (healthy) या / और (unhealthy) छवियों को ठीक से कार्य करने के लिए ।
इस उदाहरण में, मैं डॉकर की जांच कर रहा हूं-सेवा चलाने के लिए प्रत्येक 5 सेकंड की रचना करें (healthy) स्थिति।यदि स्क्रिप्ट को ऐसी सेवा मिलेगी, तो यह निष्पादन को तोड़ देगा । यदि स्क्रिप्ट 300 सेकंड से अधिक हो जाएगी, तो यह त्रुटि कोड के साथ बाहर निकल जाएगी ।
#!/bin/bashSECONDS=0LIMIT=300x=$(docker-compose -f /mnt/<service>/docker-compose.yaml ps <service> | grep -c '(healthy)')while [[ $x == "0" ]]; do echo "Please wait until <service> becomes healthy" sleep 5 x=$(docker-compose -f /mnt/<service>/docker-compose.yaml ps <service> | grep -c '(healthy)') EXPIRED=$SECONDS if [[ $x == "1" ]]; then echo "<service> is healthy..." break elif [[ $LIMIT -lt $EXPIRED ]]; then echo "<service> startup has exceeded 5m timeout, exiting!" exit 1 fidone