2015-10-07 17 views
10

मैं एक नोडजेस ऐप पर ठेठ देव के लिए वर्कफ़्लो की योजना बना रहा हूं। मुझे लगता है आप में से अधिकांश होगा:डॉकर नोडजेस डॉकर कंटेनर के अंदर

Git क्लोन [appcode] (Dockerfile स्थानीय पथ के लिए मात्रा मानचित्रण के साथ)> डोकर-लिखें सुविधा का निर्माण> ऊपर

डोकर-रचना तब मैं कुछ कोड को संपादित, अधिमानतः वेबस्टॉर्म या टेक्स्ट एडिटर सब्लिम इत्यादि जैसे आईडीई का उपयोग करना। फिर मौजूदा प्रक्रिया को मारने के लिए टर्मिनल Ctrl + C> डॉकर-लिखें (या कोड कंटेनर के लिए नोडमोन का उपयोग करने के लिए अपने कंटेनर को कॉन्फ़िगर करें) और नवीनतम स्थानीय कोड चलाने के लिए ब्राउजर रीफ्रेश करें।

क्या उपरोक्त सभी सुंदर मानक दिखते हैं?

मेरा मुख्य प्रश्न यह है कि कोई भी कंटेनर में आईडीई या नोड-निरीक्षण के साथ डीबग करता है?

मैंने बंदरगाहों को उजागर करने की कोशिश की है .. कनेक्शन अस्वीकार कर दिया गया। मेरा मानना ​​है क्योंकि node.js केवल 127.0.0.1.8858

+0

मैंने 'डॉकर लॉग-एफ [डॉकर_नाम]' –

+0

का उपयोग किया था तो @NguyenSyThanhSon क्या आप कह रहे हैं कि आप आवश्यकतानुसार लॉग आउट करके सरल डिबगिंग करने के लिए लॉग का उपयोग करते हैं? मैं एक समाधान की उम्मीद कर रहा था जहां मैं ब्रेकपॉइंट्स को सेट कर सकता हूं जैसे कि मैं वेबस्टॉर्म का उपयोग कर सामान्य नोड प्रोजेक्ट में कर सकता हूं। –

+0

इस पर थोड़ा सा काम किया, मुझे लगता है कि मेरा समाधान बहुत साफ है। आप क्या सोचते हैं मुझे बताओ। –

उत्तर

22

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

Dockerfile में, नोड निरीक्षक स्थापित:

यहाँ मेरी समाधान है। मैंने इसे वैश्विक बनाने का फैसला किया ताकि मैं अपने सभी ऐप्स को डीबग करने के लिए उसी कंटेनर का उपयोग कर सकूं।

RUN npm install -g node-inspector 
इसके बजाय CMD आदेश में नोड लंच लेने के

, एक bash स्क्रिप्ट आप एक ही प्रक्रिया से भी अधिक का शुभारंभ करने देगा कि का उपयोग करें। यह डॉकर तरीका नहीं है लेकिन जैसा कि मैंने कहा है, नोड-इंस्पेक्टर में सीमा हमें साइडकिक कंटेनर का उपयोग करने से रोकती है। आप प्रक्रिया प्रबंधन के लिए supervisor जैसे अधिक मजबूत समाधान का भी उपयोग कर सकते हैं लेकिन एक साधारण लिपि डिबग करने के लिए मेरी राय में पर्याप्त है।

CMD ["/bin/bash", "start.sh"] 

एक DEBUG वातावरण चर की उपस्थिति के लिए यह स्क्रिप्ट की जाँच करता नोड का शुभारंभ और डिबग सक्षम करने के लिए।

#!/bin/bash 

if [ -z ${DEBUG+x} ]; then 
    node server.js 
else 
    node-inspector --web-port 9080 & 
    node --debug server.js 
fi 

मैं तुम्हें स्थापित करने के लिए या नोड निरीक्षक नहीं एक ही चाल इस्तेमाल कर सकते हैं लगता है। यदि आप स्थापना के लिए स्क्रिप्ट को छोड़ना चाहते हैं तो आपके पास conditional statement in RUN command भी हो सकता है।

फिर जब आप एक कंटेनर डिबग करने के लिए चाहते हैं, यह बहुत तरह का शुभारंभ:

docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \ 
    -v /home/docker/sources/.../:/usr/src/app custom-node 

अब तुम सिर्फ क्योंकि हम स्क्रिप्ट में निर्दिष्ट डीबग पोर्ट उजागर डिबगिंग के लिए डोकर डेमॉन आईपी हिट करने के लिए की जरूरत है (9080) docker run कमांड पर। माई डॉकरफाइल पहले से ही मेरे मुख्य बंदरगाह का खुलासा करता है इसलिए मैंने -P का उपयोग किया।

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


संपादित करें: अब सहायक कंटेनर के साथ काम करता

यहाँ मेरी नोड डिबग कंटेनर की सामग्री Dockerfile

है
FROM node:4.2.1 

EXPOSE 9080 

RUN npm install -g node-inspector 

CMD ["node-inspector", "--web-port", "9080"] 

डोकर हमें 2 सुविधाओं के रूप में अगर node- इसे बनाने के लिए प्रदान करता है इंस्पेक्टर नोड प्रक्रिया के साथ स्थानीय रूप से चल रहा था।

  1. हालांकि नोड निरीक्षक मतलब है आप 127.0.0.1:8080/?ws=127.0.0.1&port=5858 से कनेक्ट करने बताकर रिमोट मशीन से कनेक्ट कर सकते लगता है, मैं किसी भी कोड है कि ws पैरामीटर पार्स करने गया था तो मैं करने के लिए डोकर शुद्ध config विकल्प का इस्तेमाल किया नहीं पा सके मेरी डीबग प्रक्रिया के रूप में उसी नेटवर्क स्टैक में नोड-डीबग कंटेनर पॉप करें: --net=container:mysvc। इस तरह, नोड-इंस्पेक्टर वेबस्केट कनेक्शन to localhost:5858 खोल सकता है।

  2. अपनी डीबग प्रक्रिया के समान माउंट पॉइंट का उपयोग करके, आप नोड-इंस्पेक्टर प्रक्रिया में नकली फ़ाइल इलाके बना सकते हैं।

अब यह एक छोटे से अधिक सुविधाजनक है, मैं अपने अनुप्रयोग स्रोतों के लिए data container उपयोग करने के लिए सुझाव है कि बनाने के लिए।

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

if [ -z ${DEBUG+x} ]; then 
    node server.js 
else 
    node --debug server.js 
fi 

तो डेटा कंटेनर बनाने:

docker create -v /home/docker/sources/.../:/usr/src/app \ 
    --name my_service-src custom-node /bin/true 

लॉन्च नोड एप्लिकेशन और बेनकाब नोड निरीक्षक डीबग पोर्ट:

docker run -d -P -p 9080:9080 --env DEBUG=1 --name my_service \ 
    --volumes-from my_service-src custom-node 

लॉन्च नोड डिबग कंटेनर:

docker run -d --net=container:my_service --volumes-from my_service-src \ 
    --name node-debug node-debug 

इस तरह, आप जल्दी से एन उत्पन्न कर सकते हैं एक नोड प्रक्रिया डीबग करने के लिए फ्लाई पर ode-debug कंटेनर।

डॉकर आईपी से कनेक्ट करें और अपने डिबगिंग सत्र का आनंद लें!

+0

यह शानदार है, मुझे नहीं लगता कि आपको इसके लिए पर्याप्त क्रेडिट मिल गया है! –

+0

नोड-इंस्पेक्टर को बहिष्कृत किया गया है github.com/node-inspector/node-inspector – Gerd

0

डीबगर (नोड-डीबग) और ऐप सर्वर (कस्टम-नोड) के लिए दो अलग-अलग छवियों का उपयोग इस मामले में कोई समझ नहीं है। कस्टम-नोड कंटेनर को नोड-इंस्पेक्टर बाइनरी भी स्थापित करने की आवश्यकता है। अन्यथा मॉड्यूल '/usr/lib/node_modules/node-inspector/lib/InjectorServer.js' त्रुटि को नोड-इंस्पेक्टर क्लाइंट-साइड कंसोल में धक्का नहीं दिया जा सकता है और कुछ भी डीबग नहीं किया जा रहा है।

0

मेरे पास एक वैकल्पिक समाधान है जो एरिक के ऊपर जैसा है लेकिन कंटेनर नेटवर्किंग के बजाय होस्ट का उपयोग करता है।

  • मुख्य नोड में।js कंटेनर, मेजबान
  • भागो डिबग के साथ मुख्य नोड प्रक्रिया सक्षम
  • एक अलग कंटेनर का प्रयोग करें नोड निरीक्षक को चलाने के लिए करने के लिए नक्शे पोर्ट 5900
  • उपयोग मेजबान नोड निरीक्षक कंटेनर

के लिए नेटवर्किंग मैं इसके बारे में यहाँ कुछ और विवरण लिखा है: https://keylocation.sg/our-tech/debugging-nodejs-in-docker-using-node-inspector

0

थोड़ी देर के लिए इस काम करने के लिए पाने के लिए संघर्ष करने के बाद, मैंने पाया कि जोड़ने:

--inspect-brk=0.0.0.0:9229

बस हमेशा की तरह inspect-brk

के बजाय

चीजें काम कर दिया।

आप भी अपनी डोकर रन आदेश में सही ढंग से अपने बंदरगाहों को मैप करने की आवश्यकता होगी:

-p 9229:9229

पूर्ण उदाहरण:

docker run -ti -p 3000:3000 -p 9229:9229 -v `pwd`:/app/ myImage bash 

node --inspect-brk=0.0.0.0:9229 /app/index.js 

तो chrome: // निरीक्षण

और "नोड के लिए समर्पित समर्पित देवटूल" दबाएं और इसे सभी काम करना चाहिए :)

संबंधित मुद्दे