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.
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
.
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!
Ho usato 'registri docker -f [nome_interporto]' –
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. –
Ho lavorato un po 'su questo, penso che la mia soluzione sia abbastanza pulita. Fatemi sapere cosa ne pensate. –