2015-10-07 27 views
10

Sto pianificando il flusso di lavoro per lo sviluppo tipico su una app nodejs. Presumo maggior parte di voi:Debug Nodejs all'interno del contenitore Docker

git clone [appcode] + (Dockerfile con mappatura del volume al percorso locale)> finestra mobile-composizione costruzione> finestra mobile-comporre up

Poi modifico qualche codice, preferibilmente utilizzando un IDE come Webstorm o editor di testo Sublime ecc. Quindi il terminale Ctrl + C per terminare il processo corrente> docker-comporre (o configurare il contenitore per utilizzare nodemon per controllare le modifiche al codice) e aggiornare il browser per vedere l'ultimo codice locale in esecuzione.

Tutto questo sembra piuttosto standard?

La mia domanda principale è che qualcuno esegua il debug con un IDE o un nodo-inspect nel container?

Ho provato a esporre porte ecc. Connessione rifiutata. Credo perché node.js consentirà il debug solo su 127.0.0.1:5858

+0

Ho usato 'registri docker -f [nome_interporto]' –

+0

Quindi @NguyenSyThanhSon stai dicendo che usi un log per eseguire il debug semplicistico disconnettendo se necessario? Speravo in una soluzione in cui è possibile impostare i punti di interruzione in modo molto simile a un progetto di nodo normale utilizzando la webstorm. –

+0

Ho lavorato un po 'su questo, penso che la mia soluzione sia abbastanza pulita. Fatemi sapere cosa ne pensate. –

risposta

22

Sono riuscito a farlo funzionare qui. Vorrei poter eseguire node-inspector come contenitore sidekick, sarebbe così pulito (EDIT: È possibile, vedere la risposta alla risposta). Sfortunatamente, esaminando le fonti di ispettori del nodo, non è possibile eseguire l'ispettore del nodo in remoto (poiché node-inspector deve accedere ai file in modo che possano visualizzarli), così anche il collegamento del contenitore è fuori dalla finestra. Forse lo sosterrà ad un certo punto.

Ecco la mia soluzione:

In Dockerfile, installare il nodo-ispettore. Ho deciso di renderlo globale, quindi posso utilizzare lo stesso contenitore per eseguire il debug di tutte le mie app.

RUN npm install -g node-inspector 

Invece di pranzare nodo nel comando CMD, utilizzare uno script bash che vi permetterà di lanciare più di un unico processo. Questo non è il modo Docker ma, come ho affermato, il limite in ispettore nodo ci impedisce di utilizzare il contenitore sidekick. Si potrebbe anche utilizzare una soluzione più robusta per la gestione dei processi come supervisor ma a mio parere per il debug di uno script semplice è sufficiente.

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

controlli questo script per la presenza di una variabile DEBUG ambiente per lanciare nodo e consentono il debug.

#!/bin/bash 

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

Immagino che si possa usare lo stesso trucco per installare o meno l'ispettore del nodo. Puoi anche avere conditional statement in RUN command se vuoi saltare lo script per l'installazione.

Poi, quando si desidera eseguire il debug di un contenitore, lanciarlo in questo modo:

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

Ora è solo bisogno di colpire il ip finestra mobile daemon per il debugging in quanto abbiamo esposto la porta di debug specificato nello script (9080) sul comando docker run. Il mio Dockerfile espone già la mia porta principale quindi ho usato -P per quello.

Se il contenitore viene eseguito su una VM locale e si è configurati dietro un proxy, assicurarsi di supportare gli indirizzi locali o di disabilitarlo prima del debug.


EDIT: ora funziona con contenitore spalla

Ecco è il contenuto del mio contenitore nodo-debug Dockerfile

FROM node:4.2.1 

EXPOSE 9080 

RUN npm install -g node-inspector 

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

Docker ci fornisce 2 caratteristiche per rendere come se node- ispettore era in esecuzione localmente con il processo del nodo.

  1. Anche se il nodo-ispettore sembra implicare è possibile connettersi al computer remoto dicendovi di connettersi a 127.0.0.1:8080/?ws=127.0.0.1&port=5858, non riuscivo a trovare alcun codice che è stato l'analisi del parametro ws modo opzione di configurazione rete finestra mobile Ho usato per inserire il contenitore di debug del nodo nello stesso stack di rete del mio processo di debug: --net=container:mysvc. In questo modo, node-inspector può aprire la connessione web socket to localhost:5858.

  2. Utilizzando lo stesso punto di montaggio del processo di debug, è possibile simulare la località del file nel processo ispettore nodo.

Ora per rendere un po 'più comodo, vorrei suggerire di usare data container per le sorgenti app.

Se si desidera che la possibilità di avviare il nodo in debug o meno, continuare a utilizzare lo script start.sh (rimuovere tuttavia il comando ispettore nodo). Mi chiedo se potremmo usare uno signal con finestra mobile, che rimuoverebbe completamente la dipendenza su start.sh.

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

Quindi creare il contenitore di dati:

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

lancio nodo app e esporre il nodo-ispettori del porto di debug:

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

lancio contenitore nodo-debug:

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

In questo modo, è possibile generare rapidamente n contenitore ode-debug al volo per eseguire il debug di un processo del nodo.

Connetti a docker ip e goditi la sessione di debugging!

+0

Questo è glorioso, non penso che tu abbia abbastanza crediti per questo! –

+0

node-inspector è deprecato vedere github.com/node-inspector/node-inspector – Gerd

0

L'uso di due immagini diverse per debugger (nodo-debug) e server applicazioni (nodo personalizzato) non ha senso in questo caso. Come il contenitore con nodo personalizzato, è necessario installare anche i file binari del nodo di ispezione. Altrimenti un Impossibile trovare il modulo '/usr/lib/node_modules/node-inspector/lib/InjectorServer.js' L'errore viene inserito nella console lato client del nodo-ispettore e non viene eseguito il debug di alcunché.

0

Ho una soluzione alternativa simile a quella di Eric, ma utilizza l'host anziché il networking del contenitore.

  • Nel nodo principale.contenitore js, porta mappa 5900 all'host
  • Eseguire il processo di nodo principale con il debug abilitato
  • Usare un contenitore separato per l'esecuzione di nodo-ispettore
  • Usa ospite di networking per il contenitore del nodo-ispettore

ho scritto qualche dettaglio in più su di esso qui: https://keylocation.sg/our-tech/debugging-nodejs-in-docker-using-node-inspector

0

Dopo aver lottato per un po 'per arrivare a questo lavoro, ho trovato che l'aggiunta di:

--inspect-brk=0.0.0.0:9229

invece che solo il solito inspect-brk

fatto funzionare le cose.

Avrete anche bisogno di mappare le porte correttamente nel comando di marcia finestra mobile:

-p 9229:9229

esempio completa:

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 

Poi vai a chrome: // ispezionare

E premi "Apri DevTools dedicato per nodo" e tutto dovrebbe funzionare :)

Problemi correlati