एक मुख्य प्रक्रिया की जांच कैसे करें जो एक डॉकटर कंटेनर में मर गई है?


13

कभी-कभी आपको एक कंटेनर की जांच करनी होती है, जिसे रोक दिया जाता है, या एक कंटेनर जो शुरू होने के बाद बहुत जल्दी मर जाता है और रुक जाता है।

docker exec -ti <id> bash केवल कंटेनर चलाने पर काम करता है, एक बार जब यह खत्म हो जाता है, तो बैश प्रॉम्प्ट भी समाप्त हो जाता है।

साथ docker startआप एक अलग आदेश की आपूर्ति नहीं कर सकते हैं, और यदि कंटेनर मरता अचानक फिर आप कंटेनर में प्राप्त करने के लिए पर्याप्त समय नहीं होगा और आपके जांच करते हैं।

हम कर सकते हैं docker commit, फिर docker runएक अलग कमांड के साथ नई छवि पर, लेकिन अगर कोई अन्य विकल्प हैं तो मैं सोच रहा हूं।

नोट : docker logsजो भी ऐप्स प्रिंटेड / stderr पर प्रिंट करते हैं, उन्हें वापस लौटा दें । यह पता लगाने के लिए पर्याप्त नहीं हो सकता है कि समस्या क्या थी।


थोड़ी देर इसके बारे में सोचने के बाद: डॉकर मुख्य प्रक्रिया ???? एक कंटेनर के रूप में केवल एक प्रक्रिया को चलाने का लक्ष्य है, या तो 'मुख्य' शब्द को हटाया जाना है, या आप कुछ अजीब कर रहे हैं (जैसे कि एक init प्रक्रिया को चलाना), या आप प्रक्रियाओं के रूप में थ्रेड ले रहे हैं ... मेरा मानना ​​है कि विकल्प एक, लेकिन मुझे यह कहना पड़ा क्योंकि यह मुझे परेशान करता है
Tensibai

@ कभी-कभी आपको कंटेनर में पीड 1 / सिग्नलिंग समस्या को संभालने के लिए डंब-इन जैसा कुछ चलाना पड़ता है, यदि आपका मुख्य कमांड इसे खुद नहीं संभाल सकता है। ऐसे अन्य मामले भी हो सकते हैं जहां एक docker कंटेनर एक से अधिक प्रक्रियाओं को चलाता है
SztupY

हां, यही मैं अजीब बात कहता हूं, मुख्यतः क्योंकि कंटेनरों को एक प्रक्रिया को अलग करने के लिए बनाया गया है। कभी-कभी कंटेनर एक ऐप के लिए समाधान नहीं होते हैं जो एक कंटेनर के अंदर सब कुछ डालने के लिए तैयार होते हैं और किसी भी चीज़ की तुलना में सिरदर्द का एक रास्ता है।
तेंसिबाई

जवाबों:


9

लिनक्स में एक प्रक्रिया असफल क्यों हुई, इसे ट्रैक करने के सामान्य तरीके अच्छे हैं। ऐसा ही एक तरीका एक प्रक्रिया को चलाना है, straceजिसका उपयोग करके आपको सिस्टम कॉल प्रक्रिया को बताया जाएगा और आमतौर पर विफलता का कारण बताया जाएगा।

आप ऐसा बना सकते हैं Dockerfileजो कुछ इस तरह दिखता है:

FROM original_image

RUN apt-get -y update && apt-get install -y strace

# build with `docker build -t debug_version`

फिर अपनी नई छवि का उपयोग करके चलाएं docker run debug_version strace original_cmd

उन प्रक्रियाओं के लिए जो कांटा बच्चों (और फिर मर जाते हैं) आप विकल्प के straceसाथ चलाना चाहते हैं -ff। आप डॉकर डेटा वॉल्यूम का उपयोग करके कुछ फ़ाइल भी मैप कर सकते हैं और इसे लिखने के लिए -oविकल्प का उपयोग straceकर सकते हैं। लेकिन सामान्य तौर straceपर स्टडआउट पर आउटपुट छोड़ देगा, जो उपयोग करने योग्य है docker log

संबंधित प्रश्न: लिनक्स प्रक्रिया रहस्यमय तरीके से समाप्त हो जाती है


इसका मतलब है कि मेरे पास अभी भी docker commitमेरे पहले से बंद कंटेनर को शुरू करने के लिए एक छवि है
SztupY

आपने कहा कि यह शुरू होने पर मर जाता है। मुझे लगता है कि आपके पास एक छवि है। जो रुके हुए हैं, उनके लिए हाँ एक वचन की आवश्यकता है।
एवगेनी

एक बंद कंटेनर पाने के लिए केवल एक ही परिदृश्य है
SztupY

straceअल्पाइन लिनक्स, pkgs.alpinelinux.org/package/edge/main/x86_64/strace में एक पैकेज भी है । , यह स्थापित करने के लिए अल्पाइन पैकेज प्रबंधक का उपयोग apk install strace
इवगेनी

3

जहाँ तक मैं जानता हूँ, commitऔर runयहाँ सबसे अच्छे विकल्प हैं कि आप कंटेनर तक पूरी पहुँच प्रदान करें क्योंकि यह मर गया था।

आदर्श रूप से, आपका कंटेनर विफल होने पर कुछ और उपयोगी जानकारी थूक देगा, लेकिन यह एक और विषय है।

संपादित करें: मेरे उत्तर का विस्तार करने के लिए, यदि कंटेनर सही शुरुआत में मर रहा है, तो आप docker runवैकल्पिक --entrypointऔर निर्दिष्ट करने के लिए भी उपयोग कर सकते हैं CMD। आम तौर पर मैं इसे एक लूप या ऐसी चीज़ पर सेट करूँगा जो अपने आप बाहर नहीं निकलेगी। एक बार जब आप कंटेनर में होते हैं, तो आप मैन्युअल रूप से उन चरणों को चला सकते हैं जो विफल हो रहे हैं, और फिर कंटेनर से बाहर निकलने के बारे में चिंता किए बिना परिणाम का निरीक्षण करें।

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