मैं एक डॉक कंटेनर इनिशियलाइज़ेशन को कैसे डीबग कर सकता हूं?


92

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

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 -l विफल क्यों ls क्यों नहीं हुआ।

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


कृपया उत्तर में से एक को "स्वीकृत" के रूप में चिह्नित करने का प्रयास करें, धन्यवाद!
ब्रायन टॉपिंग

जवाबों:


94

Docker eventsकमांड मदद कर सकती है और Docker लॉग कमांड शुरू होने के बाद भी लॉग को ला सकता है।

सबसे पहले 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&यदि आपके कंटेनर को AWS ECS सेवा जैसी किसी चीज़ से लगातार पुनरारंभ किया जा रहा है, तो परेशानी हो सकती है। इस परिदृश्य में कंटेनर हेक्स आईडी को लॉग से बाहर निकालना आसान हो सकता है /var/log/ecs/ecs-agent.log.<DATE>। फिर डॉकटर का उपयोग करें logs <hex id>


बहुत उपयोगी! नया करने के लिए और portainer चलाने की कोशिश कर रहा था। इन डिबगिंग चरणों के साथ इसे हल किया। किसी को इसी समस्या के साथ Medium.com पर पाया गया: medium.com/@jameson_37151/…
Jameson

मुझे "कंटेनर नहीं मिला" !?
हेजहोग

अजीब। बस यह सुनिश्चित करने के लिए, @deantedhedgehog क्या आपने " (from xxx/xxx:latest) die" में समाप्त होने वाले लॉग संदेश से हेक्स-आईडी की प्रतिलिपि बनाने की कोशिश की ?
पीटर लैम्बबर्ग

1
इस उत्तर के लिए बहुत बहुत धन्यवाद, यह एक जीवन रक्षक है। केवल जोड़ने वाली बात यह है कि docker events&परेशानी हो सकती है यदि आपके कंटेनर को AWS ECS सेवा जैसी किसी चीज़ से लगातार पुनरारंभ किया जा रहा है। तो इस परिदृश्य में कंटेनर हेक्स आईडी को लॉग से बाहर निकालना आसान हो सकता है /var/log/ecs/ecs-agent.log.<DATE>। फिर docker logs <hex id>इस उत्तर के अनुसार सुझाव दें कि क्यों चीजें बूट नहीं हो रही हैं।
एलेक्सबिक

1
@alexkb धन्यवाद! मैंने आपके सुझाव को उत्तर के अंत में जोड़ दिया ताकि दूसरों को यह अधिक आसानी से मिल सके।
पीटर लैम्बबर्ग

18

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

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

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


13

मेरे मामले में, -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) दिखाया । मुझे लगता है कि अधिकांश कंटेनर स्टार्टअप त्रुटियाँ यहाँ भी दिखाई देंगी।


3

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

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

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

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


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

0

कभी-कभी, आप docker daemon को चलाने वाले नोड में sshing और फिर कर के उपयोगी त्रुटि संदेश पा सकते हैं:

$ tail -f /var/log/containers/* /var/log/docker.log 2>&1

मैक ओएस पर 'डॉकर कम्युनिटी एडिशन' पर, आप ऐसा करके docker vm में जुड़ सकते हैं:

$  screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.