कैसे पता लगाएं कि क्या डॉक चलाने वाला प्रोग्रामेटिक रूप से सफल हुआ है?


83

मैं जल्दी से जाँचने के लिए एक बहुत ही सरल बैश स्क्रिप्ट लिख रहा हूँ कि मेरा कंटेनर अभी भी बनाता है और सही ढंग से शुरू होता है और यह कि एप्लिकेशन अनुरोधों का जवाब देता है।

कभी-कभी docker runविफल रहता है, उदाहरण के लिए, क्योंकि मैं जिस कंटेनर को बांधने की कोशिश कर रहा हूं वह पोर्ट पहले से ही आवंटित है। लेकिन जब ऐसा होता docker runहै तो बाहर निकलने का कोड अभी भी 0 है इसलिए मैं निकास कोड का उपयोग नहीं कर सकता। मैं प्रोग्रामेटिक रूप से कैसे जांच कर सकता हूं कि कंटेनर सही ढंग से शुरू हो गया है?

मैं जिन समाधानों पर विचार कर रहा हूं, वे हैं:

  • त्रुटियों के लिए आउटपुट पार्स करें
  • docker ps यह देखने के लिए कि क्या कंटेनर चल रहा है

लेकिन ये दोनों थोड़े ओवरकिल और बदसूरत लगते हैं। क्या मुझे यह जांचने का एक बेहतर तरीका याद आ रहा है कि क्या docker runसफल हुआ?


1
मुझे यकीन नहीं है कि यहाँ क्या समस्या है। यदि विचाराधीन प्रक्रिया सामान्य तरीके से व्यवहार करती है तो आप बस बाहर निकलने के कोड की जांच कर सकते हैं। यदि यह विफल मामलों के लिए भी 0 से बाहर निकलें कोड का उत्सर्जन करता है, तो यह पता लगाने की कोशिश करें कि क्या यह बग है। यदि प्रोग्राम किसी भी स्थिति में 0 से बाहर निकलें कोड देता है, तो शायद आप आउटपुट को पार्स करने के अलावा कोई विकल्प नहीं छोड़ सकते हैं।
devnull

जैसा कि @devnull ने कहा, यदि आप भरोसा नहीं कर सकते कि docker runविफलता पर एक गैर-शून्य रिटर्न कोड लौटाएगा जैसा कि आप इंगित करते हैं तो आप केवल इतना कर सकते हैं कि आउटपुट पार्स (जो जटिल या नाजुक हो सकता है) या किसी अन्य कमांड का उपयोग करें (यानी आपका psसुझाव ) पहले कमांड के परिणाम की जांच करने के लिए। आप यह देखने के लिए कि क्या वे रिटर्न कोड को runभी ठीक कर सकते हैं, डॉकटर के साथ टिकट दाखिल करने पर विचार करना चाहते हैं।
इटन रीसनर

सुनिश्चित करें कि आपके पास नवीनतम संस्करण है।
ओगा

क्या यह कस्टम कोड है जिसे आपके कंटेनर में चलाया जा रहा है? यदि ऐसा है, तो आप अपने डॉकरफाइल में एक पोर्ट एक्सपोर्ट कर सकते हैं, जब आपका प्रोग्राम स्थिर चल रहा हो तो उस पोर्ट पर "ओके" संदेश भेजें। आपका ग्राहक कोड "ओके" संदेश की प्रतीक्षा करता है।
रेक्सपोसैडस

3
क्या आप एक उदाहरण प्रदान कर सकते हैं कि आप किस प्रकार से डॉक कर रहे हैं और कौन सा संस्करण? एक त्वरित परीक्षण मेरे लिए 1 होने का डॉकटर एक्जिट कोड दिखाता हैdocker run -d -p 9010:9010 busybox true ; echo $?
एबेल मुईनो जूल

जवाबों:


118

जैसा कि हाबिल मुइनो ने टिप्पणियों में सुझाया है, यह हाल के डॉकटर संस्करणों में तय किया गया है (मैं वर्तमान में 0.9.1 चला रहा हूं)।

लेकिन, यदि आप अस्थायी रूप से मेरे जैसे पुराने संस्करण के साथ फंस गए हैं, तो मुझे यह जांचने के लिए एक अच्छा समाधान मिला है कि क्या कंटेनर का उपयोग करके शुरू किया गया था docker inspect

docker inspectकंटेनर के बारे में बहुत सारी जानकारी के साथ एक JSON ऑब्जेक्ट लौटाता है, और विशेष रूप से कि कंटेनर वर्तमान में चल रहा है या नहीं। -fझंडा आप आसानी से बिट्स की जरूरत निकालने की सुविधा देता है:

docker inspect -f {{.State.Running}} $CONTAINER_ID

या

docker inspect -f "{{.State.Running}}" $CONTAINER_ID

वापस आ जाएगी trueया false

ध्यान दें कि आप संभवतः sleep 1कंटेनर को शुरू करने और चेक करने के बीच (या अधिक) चाहते हैं कि यह ऊपर है या नहीं। यदि आपके सेटअप में कुछ गड़बड़ है, तो संभव है कि यह वास्तव में बाहर निकलने से पहले बहुत कम समय के लिए 'चल रहा' हो।


11
इसके बजाय उपयोग docker inspect -f {{.State.Running}} <container-id>और उपयोग क्यों नहीं jq? बस सोच रहा।
धर्मित

2
क्योंकि मुझे एहसास नहीं था कि निरीक्षण आपको सीधे करने देता है! धन्यवाद @DharmitShah यह एक बढ़िया सुझाव है, मैं अपने उत्तर को अपडेट करूँगा।
जूल्स ओलेऑन

2
इस तरह के कंटेनर नहीं होने पर त्रुटि संदेश को दबाने के लिए, साथ में पुनर्निर्देशित stderr 2> /dev/null
thSoft

अगर मैं इसे एक var को असाइन कर रहा हूं, 2> /dev/nullतो किसी भी चीज़ का मूल्यांकन नहीं करने के बाद से मुझे एक त्रुटि मिलती है। falseयदि कंटेनर मौजूद नहीं है तो मैं इसे कैसे डिफ़ॉल्ट बना सकता हूं ?
जेक संके

1
हालांकि यह उन कंटेनरों को समायोजित नहीं करता है जो पुनरारंभ नीति के कारण लगातार पुनरारंभ हो रहे हैं ... यानी यदि एक कंटेनर को पुनः आरंभ करने की नीति दी जाती है जब तक कि रोक नहीं दी जाती है / हमेशा .State.Running हमेशा सही लौटेगा .... बस कुछ करने के लिए थके हुए हो!
गीक्सक्रैप

22

किसी भी चीज़ को पार्स करने से बचने के लिए, आप डॉकटर टॉप का उपयोग कर सकते हैं , जो कंटेनर नहीं चलने पर 1 लौटाता है:

id=$(docker run mycontainer)
if ! docker top $id &>/dev/null
then
    echo "Container crashed unexpectedly..."
    return 1
fi

10

हम उपयोग कर सकते हैं docker exec $id true 2>/dev/null || echo not running

यह कमांड स्टडआउट को नहीं लिखता है, जैसा कि "डूकर टॉप" करता है। यह stderr को लिखता है जब कंटेनर नहीं चल रहा है, "docker top" के समान संदेश।


2

सुझावों को एक स्क्रिप्ट में उल्लिखित करना।

1 - एक स्क्रिप्ट बनाएं keepMyDockerUp.sh :

vi keepMyDockerUp.sh


#!/bin/bash
Container_ID=INSERT_YOUR_CONTAINER_ID HERE
result=$( docker inspect -f {{.State.Running}} $Container_ID)
echo "result is" $result
if [ $result = "true" ]
then
echo "docker is already running"
else
systemctl restart docker
docker start $Container_ID
fi

2 - फिर इसे क्रोन में जोड़ें, इसलिए आपकी स्क्रिप्ट सत्यापित करती है कि आपका डॉकटर कंटेनर समय-समय पर है या नहीं:

crontab -e

अंतिम पंक्ति पर जाएं और अपनी स्क्रिप्ट फ़ाइल जोड़ें। उदाहरण के लिए:

* * * * * /root/keepMyDockerUp.sh

3 - क्रॉस्टैब को बचाएं और अपने डॉकटर कंटेनर के फिर से नीचे जाने की चिंता न करें।

आशा है कि इससे सहायता मिलेगी...

;-)


1

मुझे उपयोग करना था:

$ docker inspect -f {{.State.Health.Status}} xxx

(कंटेनर चालू था, लेकिन कंटेनर के अंदर सेवा पूरी तरह से शुरू नहीं हुई थी।

निरीक्षण उत्पादन का हिस्सा:

"State": {
    "Status": "running",
    "Running": true,
    "Paused": false,
    "Restarting": false,
    "OOMKilled": false,
    "Dead": false,
    "Pid": 1618,
    "ExitCode": 0,
    "Error": "",
    "StartedAt": "2019-03-08T10:39:24.061732398Z",
    "FinishedAt": "0001-01-01T00:00:00Z",
    "Health": {
        "Status": "starting",
        "FailingStreak": 0,
        "Log": []

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