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.
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.
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!
Ich benutze 'docker logs -f [docker_name]' –
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. –
Habe ein wenig daran gearbeitet, denke, dass meine Lösung ziemlich sauber ist. Lass mich wissen was du denkst. –