सवाल मैं एक डॉकर कंटेनर प्रारंभिक कैसे डीबग कर सकता हूं?


मुझे एक कंटेनर के साथ कोई समस्या थी, भले ही यह पूरी तरह से बनाता है, यह ठीक से शुरू नहीं होता है। कारण डॉकरफाइल में जोड़ा गया एक वर्कअराउंड है (एक स्वयं कॉन्फ़िगर / etc / hosts रूटिंग के लिए)

RUN mkdir -p -- /lib-override /etc-override && cp /lib/libnss_files.so.2 /lib-override
ADD hosts.template /etc-override/hosts
RUN perl -pi -e 's:/etc/hosts:/etc-override/hosts:g' /lib-override/libnss_files.so.2
ENV LD_LIBRARY_PATH /lib-override

जाहिर है, वहां कुछ गलती है, लेकिन मुझे आश्चर्य है कि मैं चलने के दौरान डॉकर क्या कर रहा हूं, इस बारे में अधिक जानकारी कैसे प्राप्त कर सकता हूं। उदाहरण के लिए, यह काम करता है:

$ docker run image ls
usr bin ...

लेकिन यह नहीं है:

$ docker run image ls -l
$

लॉग में कुछ भी नहीं है और मैं एक इंटरैक्टिव खोल भी नहीं कह सकता। मैं यह देखने के लिए स्ट्रेस का उपयोग कर सकता हूं कि क्या हो रहा है लेकिन मैं उम्मीद कर रहा था कि यह एक बेहतर तरीका है।

क्या कोई तरीका है कि मैं डॉकर को अधिक वर्बोज़ सेट कर सकता हूं?

संपादित करें: एंड्रयू डी के लिए धन्यवाद। अब मुझे पता है कि ऊपर दिए गए कोड के साथ क्या गलत है (मैंने इसे छोड़ दिया ताकि उसका जवाब समझा जा सके)। अब मुद्दा अभी भी है कि मैं इस तरह कुछ कैसे डिबग कर सकता हूं या क्यों कुछ अंदरूनी हो सकता हूं एलएस-एल असफल क्यों ls नहीं किया।

संपादित करें: -D = सत्य अधिक आउटपुट दे सकता है, हालांकि मेरे मामले में नहीं ...


61
2018-05-19 15:28


मूल


उत्तर में से एक को "स्वीकृत" के रूप में चिह्नित करने का प्रयास करें, धन्यवाद! - Brian Topping


जवाब:


डाक में काम करनेवाला मज़दूर events आदेश मदद कर सकता है और डॉकर लॉग छवि शुरू होने में विफल होने के बावजूद भी कमांड लॉग प्राप्त कर सकता है।

पहली शुरुआत docker events क्या चल रहा है यह देखने के लिए पृष्ठभूमि में।

docker events&

फिर अपनी असफलता चलाएं docker run ... आदेश। फिर आपको स्क्रीन पर निम्न की तरह कुछ देखना चाहिए:

2015-12-22T15:13:05.503402713+02:00 xxxxxxxacd8ca86df9eac5fd5466884c0b42a06293ccff0b5101b5987f5da07d: (from xxx/xxx:latest) die

फिर आप पिछले संदेश से स्टार्टअप हेक्स आईडी या रन कमांड के आउटपुट प्राप्त कर सकते हैं। फिर आप इसे लॉग कमांड के साथ उपयोग कर सकते हैं:

docker logs <copy the instance id from docker events messages on screen>

अब आपको असफल छवि स्टार्टअप से कुछ आउटपुट देखना चाहिए।

जैसा कि @alexkb ने एक टिप्पणी में सुझाव दिया: docker events& यदि आपके कंटेनर को एडब्ल्यूएस ईसीएस सेवा जैसे कुछ से लगातार पुनरारंभ किया जा रहा है तो परेशानी हो सकती है। इस परिदृश्य में कंटेनर हेक्स आईडी लॉग से बाहर होना आसान हो सकता है /var/log/ecs/ecs-agent.log.<DATE>। फिर डॉकर का प्रयोग करें logs <hex id>


61
2017-12-22 13:24



बहुत मददगार! डॉकर के लिए नया और पोर्टनर चलाने की कोशिश कर रहा था। इन डीबगिंग चरणों के साथ इसे हल किया। किसी भी समस्या के साथ Medium.com पर किसी को मिला: medium.com/@jameson_37151/... - Jameson
मुझे "कंटेनर नहीं मिला" मिलता है ?? - demented hedgehog
अजीब। बस यह सुनिश्चित करने के लिए, @dementedhedgehog ने हेक्स-आईडी को लॉग संदेश से "(from xxx/xxx:latest) die"? - Peter Lamberg
इस जवाब का बहुत बहुत धन्यवाद, यह एक जीवन बचतकर्ता है। जोड़ने के लिए केवल एक चीज है कि docker events& यदि आपके कंटेनर को एडब्ल्यूएस ईसीएस सेवा जैसे कुछ से लगातार पुनरारंभ किया जा रहा है तो परेशानी हो सकती है। इसलिए इस परिदृश्य में कंटेनर हेक्स आईडी लॉग से बाहर होना आसान हो सकता है /var/log/ecs/ecs-agent.log.<DATE>। फिर उपयोग करें docker logs <hex id> जैसा कि इस जवाब से सुझाव दिया गया है कि क्यों चीजें बूट नहीं हो रही हैं। - alexkb
@alexkb धन्यवाद! मैंने आपके सुझाव को उत्तर के अंत में जोड़ा ताकि अन्य लोग इसे अधिक आसानी से पा सकें। - Peter Lamberg


वैसे सबसे अच्छा मैंने अब तक पाया है:

#stop the current demon and start it in debug modus
sudo service docker stop
dockerd -D # --debug

बस क्लाइंट को एक नए खोल से शुरू करें। गलत धारणा यह थी कि क्लाइंट वास्तव में कुछ भी करता है ... अच्छा यह सिर्फ डेमॉन के साथ संवाद कर रहा है, इसलिए आप नहीं चाहते हैं डिबग ग्राहक लेकिन खुद ही डिमन (आमतौर पर)।


15
2018-05-26 09:07





मेरे मामले में, -a (STDOUT / STDERR से संलग्न) ध्वज पर्याप्त था:

user@machine:~$ docker start -a server_name
Error: The directory named as part of the path /log/log_path/app.log does not exist.
For help, use /usr/bin/supervisord -h

यह स्टार्टअप त्रुटि दिखाता है (हमारे मामले में, एक लापता लॉग पथ द्वारा उपयोग किया जाता है supervisord)। मुझे लगता है कि अधिकांश कंटेनर स्टार्टअप त्रुटियां भी यहां दिखाई देंगी।


7
2018-03-29 13:27





मैं डॉकर आउटपुट को और अधिक पूरा करने के तरीके पर आपके प्रश्न का उत्तर नहीं दे सकता लेकिन मैं आपको बता सकता हूं कि एक .so फ़ाइल में एक स्ट्रिंग को प्रतिस्थापित करने के लिए जगह में रीजिक्स थोड़ा पागल है: स्ट्रिंग में केवल इतना आवंटित स्थान है, और यदि आप अन्य प्रविष्टियों के फ़ाइल ऑफसेट को बदलते हैं, तो एल्फ फ़ाइल दूषित हो जाती है। Perl कमांड चलाने के बाद ob.d फ़ाइल पर objdump या readelf चलाने का प्रयास करें (एलडी_LIBRARY_PATH परिवर्तन से पहले) एक कंटेनर के बाहर - डोनट्स के लिए डॉलर अब भ्रष्ट है।

कारण यह काम करता है इस दुखद जरूरी हैक में ऐसा इसलिए है क्योंकि "tmp" और "आदि" एक ही स्ट्रिंग लंबाई हैं इसलिए कोई ऑफसेट नहीं बदलता है। यदि आप / tmp का उपयोग नहीं करना चाहते हैं तो निर्देशिका / डीकेआर या इसी तरह के विचार पर विचार करें।

यदि आपको यह दृष्टिकोण लेना चाहिए और आपके वांछित पथ अपरिवर्तनीय हैं, तो लाइब्रेरी का पुनर्निर्माण करें और स्रोत में / etc / hosts के लिए डिफ़ॉल्ट पथ बदलें। या बेहतर, जब आपके संशोधित निर्माण libnss_files.so इसे कुछ ऐसा नाम दें libnss_altfiles.so और बदलें nsswitch.conf उपयोग करने के लिए hosts: altfiles अपने डॉकर कंटेनर को शुरू करते समय (जब तक डॉकर ने nsswitch.conf पर भी बाध्य नहीं किया है, तब आप इसे बदल नहीं सकते हैं)। इससे आपको बेस सिस्टम में अपने सामान्य पुस्तकालयों के साथ समानांतर में libnss_altfiles.so मिल जाएगा। यदि डॉकर nsswitch.conf को बाध्य करता है, तो अपनी पुनर्निर्मित libnss_files.so की प्रतिलिपि को अपनी / lib-override निर्देशिका में LD_LIBRARY_PATH द्वारा लोड करने के लिए तैयार करें।

एक सिर के रूप में, suid / sgid binaries LD_LIBRARY_PATH और LD_PRELOAD को अनदेखा करते हैं, इसलिए कुछ चीजें तोड़ने जा रही हैं (पढ़ें: डिफ़ॉल्ट / etc / hosts का उपयोग करने के लिए वापस जाएं) यदि आप उन चर का उपयोग करते हैं।


2
2018-05-19 21:01



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