2015-10-07 11 views
10

Ich plane den Arbeitsablauf für typische Entwickler in einer Nodejs App. Ich nehme an die meisten von Ihnen würden:Debug Nodejs in Docker Container

git clone [AppCode] + (Dockerfile mit Volumen-Mapping auf lokaler Pfad)> Docker-compose build> Docker-komponieren bis

Dann habe ich einige Code bearbeiten, vorzugsweise mit einem IDE wie Webstorm oder Texteditor Sublime etc. Dann terminal Ctrl + C, um den aktuellen Prozess zu beenden> docker-komponieren (oder konfigurieren Sie Ihren Container zur Verwendung von nodemon um Codeänderungen zu beobachten) und Browser aktualisieren, um neuesten lokalen Code zu sehen.

Sieht alles oben ziemlich Standard aus?

Meine Hauptfrage ist, ob jemand debuggen entweder mit einer IDE oder Node-Inspektion in den Container?

Ich habe versucht, Ports usw. offen legen. Verbindung verweigert. Ich glaube, weil node.js nur das Debuggen auf 127.0.0.1:5858

+0

Ich benutze 'docker logs -f [docker_name]' –

+0

Also @NguyenSyThanhSon sagst du, dass du ein Log verwendest, um einfaches Debugging durchzuführen, indem du dich bei Bedarf ausloggst? Ich habe auf eine Lösung gehofft, bei der ich Breakpoints setzen kann, so wie ich es in einem normalen Knotenprojekt mit webstorm kann. –

+0

Habe ein wenig daran gearbeitet, denke, dass meine Lösung ziemlich sauber ist. Lass mich wissen was du denkst. –

Antwort

22

ich es geschafft habe, es hier laufen zu lassen. Ich wünschte, ich könnte node-Inspector als Sidekick-Container laufen lassen, es wäre so sauber (EDIT: Es ist möglich, siehe Ende der Antwort). Leider ist es bei der Betrachtung von Knoten-Inspector-Quellen nicht möglich, node-inspector remote auszuführen (da node-inspector auf Dateien zugreifen muss, um sie anzuzeigen), sodass die Containerverknüpfung nicht im Fenster angezeigt wird. Vielleicht wird es das irgendwann unterstützen.

Hier ist meine Lösung:

In Dockerfile, node-Inspektor installieren. Ich habe beschlossen, es global zu machen, damit ich den gleichen Container verwenden kann, um alle meine Apps zu debuggen.

RUN npm install -g node-inspector 

Stattdessen Knoten im CMD Befehl von lunching, verwenden Sie einen Bash-Skript, das Sie mehr als ein einziger Prozess starten lassen. Dies ist nicht der Docker-Weg, aber wie ich schon sagte, verhindern wir im node-Inspector, Sidekick-Container zu benutzen. Sie könnten auch eine robustere Lösung für das Prozessmanagement wie supervisor verwenden, aber für das Debuggen eines einfachen Skripts ist meiner Meinung nach genug.

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

Dieses Skript überprüft das Vorhandensein eines DEBUG Umgebungsvariable Knoten starten und debuggen können.

#!/bin/bash 

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

Ich denke, Sie könnten den gleichen Trick zu installieren oder nicht Node-Inspector verwenden. Sie können sogar conditional statement in RUN command haben, wenn Sie das Skript für die Installation überspringen möchten.

Dann, wenn Sie einen Container debuggen wollen, starten Sie es wie folgt:

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

Jetzt müssen Sie nur noch die Docker Daemon ip für das Debuggen getroffen, da wir den Debug-Port angegeben im Skript (9080) ausgesetzt auf dem docker run Befehl. Meine Dockerfile macht bereits meinen Hauptport frei, also habe ich -P dafür benutzt.

Wenn Ihr Container auf einer lokalen VM ausgeführt wird und Sie hinter einem Proxy eingerichtet sind, stellen Sie sicher, dass er entweder lokale Adressen unterstützt oder Sie ihn vor dem Debuggen deaktivieren.


EDIT: funktioniert jetzt mit Kumpel Behälter

Hier ist der Inhalt meiner node-Debug-Container Dockerfile

FROM node:4.2.1 

EXPOSE 9080 

RUN npm install -g node-inspector 

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

Docker bietet uns zwei Features, die es als ob node- zu machen Inspector wurde lokal mit dem Node-Prozess ausgeführt.

  1. Obwohl Knoten-Inspektor zu implizieren scheint, Sie zu Remote-Computer verbinden können Sie sagen zu 127.0.0.1:8080/?ws=127.0.0.1&port=5858 zu verbinden, konnte ich keinen Code finden, der die ws Parameter Parsen wurde so verwendet, ich Docker net config Option Setzen Sie den Knoten-debug-Container in den gleichen Netzwerkstack wie mein Debug-Prozess: --net=container:mysvc. Auf diese Weise kann node-inspector die Websocket-Verbindung to localhost:5858 öffnen.

  2. Wenn Sie denselben Einhängepunkt wie bei Ihrem debugged-Prozess verwenden, können Sie den Dateilokalisierungsort dem Knoten-Inspector-Prozess vortäuschen.

Jetzt ist es ein wenig bequemer zu machen, würde ich data container für Ihre App Quellen verwenden vorschlagen.

Wenn Sie die Möglichkeit haben möchten, den Knoten im Debug zu starten oder nicht, verwenden Sie weiterhin das Skript start.sh (entfernen Sie jedoch den Knoten Inspektor Befehl). Ich frage mich, ob wir eine signal mit Docker verwenden könnten, die die Abhängigkeit von start.sh vollständig entfernen würde.

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

So den Datencontainer erstellen:

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

Starten Sie Knoten App und belichten Torknoten-Inspektor debug:

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

Starten Sie Knoten-Debug-Container:

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

Auf diese Weise können Sie schnell n spawnen Ode-Debug-Container im laufenden Betrieb, um einen Knotenprozess zu debuggen.

Verbinden Sie sich mit docker ip und genießen Sie Ihre Debugging-Sitzung!

+0

Das ist herrlich, ich glaube nicht, dass du genug Credits dafür hast! –

+0

node-inspector ist veraltet, siehe github.com/node-inspector/node-inspector – Gerd

0

Die Verwendung von zwei verschiedenen Images für Debugger (Node-Debug) und App-Server (Custom-Node) hat in diesem Fall keinen Sinn. Als benutzerdefinierte Knoten Container benötigt, Knoten-Inspector-Binärdateien auch installiert werden. Sonst ein Kann Modul nicht finden '/usr/lib/node_modules/node-inspector/lib/InjectorServer.js' Fehler wird in Node-Inspektor Client-Side-Konsole geschoben und nichts wird auch debugged.

0

Ich habe eine alternative Lösung, die Eric's oben ähnlich ist, aber Host statt Container-Netzwerk verwendet.

  • Im Hauptknoten.js Behälter, Karte Port 5900 zum Host
  • Run der Hauptknoten Prozess mit debug
  • Verwenden eines separater Behälter für die Ausführung von node-Kontrolleur aktiviert
  • Verwenden Host für den Knoten-Kontrolleur Behälter Vernetzung

ich schrieb ein paar mehr Details über sie hier: https://keylocation.sg/our-tech/debugging-nodejs-in-docker-using-node-inspector

0

Nachdem er eine Weile kämpfen diese Arbeit zu bekommen, fand ich, dass das Hinzufügen:

--inspect-brk=0.0.0.0:9229

statt nur die üblichen inspect-brk

gemacht Dinge funktionieren.

Sie werden auch Ihre Ports müssen korrekt in Ihrem Docker Fahrbefehl zur Karte:

-p 9229:9229

Voll Beispiel:

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 

Dann gehen Sie zu chrome: // inspizieren

Und klicken Sie auf "DevTools für Knoten öffnen" und es sollte alles funktionieren :)