新知识点!一文告诉你如何调试运行在Docker容器中的远程Node.js应用程序
作者 | Terence Shin
翻译 | 天道酬勤,责编 | Carol
出品 | CSDN云计算(ID:CSDNcloud)
你知道吗?
如果你想要调试已运行在远程计算机上Docker容器内的Node.js应用程序,并且希望无需修改命令参数(启用调试模式),其实并不需要向全世界开放远程Node.js调试器代理端口来实现。
或许你原本不知道这真的可以实现,也不知道该如何实现。不过当你看完本文,就会Get 到一些新奇的知识点,话不多说,往下看吧!
TdodoMVC演示应用程序
作者将使用TodoMVC Node.js应用程序的一个Github分支(由Gleb Bahmutov创建)作为本文的演示应用程序,可以随意克隆并使用此代码库:https://github.com/alexei-led/todomvc-express。
下面是添加的用于TodoMVC应用程序的Dockerfile,它允许在Docker容器中运行TodoMVC应用程序。
FROM alpine:3.5
# install node
RUN apk add --no-cache nodejs-current tini
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# Build time argument to set NODE_ENV (‘production’’ bydefault)
ARG NODE_ENV
ENV NODE_ENV ${NODE_ENV:-production}
# install npm packages: clean obsolete files
COPY package.json /usr/src/app/
RUN npm config set depth 0 && \
npm install && \
npm cache clean && \
rm -rf /tmp/*
# copy source files
COPY . /usr/src/app
EXPOSE 3000
# Set tini as entrypoint
ENTRYPOINT [“/sbin/tini”, “--“]
CMD [ “npm”, “start” ]
# add VCS labels for code sync and nice reports
ARG VCS_REF=”local”
LABEL org.label-schema.vcs-ref=$VCS_REF \
org.label-schema.vcs-url="https://github.com/alexei-led/todomvc-express.git"
在Docker容器中构建和运行TodoMVC
要为TodoMVC应用程序构建新的Docker映像,请运行docker build命令。
$ # build Docker image; set VCS_REF tocurrent HEAD commit (short)
$ docker build -t local/todomvc --build-argVCS_REF=`git rev-parse ---short HEAD` .
$ # run TodoMVC in a Docker container
$ docker run -d -p 3000:3000 --name todomvclocal/todomvc node src/start.js
计划
最终目标:作者希望能够将Node.js调试器添加到AWS云中的远程主机上Docker容器中已经启动并运行的Node.js应用程序上,而无需修改应用程序、容器、容器配置或使用其他调试标志重新启动它。
想象一下,该应用程序正在运行,但是现在发生了一些问题。作者想使用调试器连接到该应用程序并开始查看问题。
因此,作者需要一个计划一个逐步的流程,这将有助于实现最终目标。下面让我们来探索操作流程。
在服务器(AWS EC2 VM)机器上,有一个运行在Docker容器中的Node.js应用程序。在客户端(笔记本电脑)上,使用一个IDE(Visual Studio Code),Node.js应用程序代码(git pull /clone)和一个Node.js调试器。下面是计划清单:
将已经运行的应用程序设置为调试模式 公开一个新的Node.js调试器代理端口,以安全的方式启用远程调试 同步客户端-服务器代码:两者都应在git树中的相同的提交上 将本地Node.js调试器添加到远程服务器上的Node.js调试器代理端口,并以安全的方式进行 如果一切正常,应该能够执行常规的调试任务,例如设置断点、检查变量和暂停执行等。
通过使用debug命令行标志启动Node或使用SIGUSR1通知现有的Node进程,可以启用和访问V8调试器。(Node API文档)
1)将TodoMVC设置为调试模式
使用docker kill --signal命令将SIGUSR1发送到在Docker容器中运行的PID 1进程,如果它是正确的(正确完成信号转发)初始化应用程序(如tini),那么它将起作用; 或者在已经运行的Docker容器中执行kill -s SIGUSR1,将SIGUSR1信号发送到主Node.js进程。
$ # send SIGUSR1 with docker kill (if usingproper init process)
$ docker kill --signal SIGUSR1 todomvc
$ # OR run kill command for node processinside todomvc container
$ docker exec -it todomvc sh -c ‘kill -sSIGUSR1 $(pidof -s node)’
$ docker logs todomvcTodoMVC server listening athttp://:::3000
emitting 2 todos server has new 2 todos
GET / 200 31.439 ms — 3241
GET /app.css 304 4.907 ms
— —
Starting debugger agent.
Debugger listening on 127.0.0.1:5858
允许从任何(或特定)IP(或IP范围)连接到调试器代理 公开Docker容器外部的Node.js调试器代理的端口
socat是基于命令行的实用程序,可建立两个双向字节流并在它们之间传输数据。因为可以从大量不同类型的数据接收器和源(请参阅地址类型)中构造流,并且由于可以将大量地址选项应用于流,所以socat可以用于许多不同的目的。
FROM alpine:3.5
RUN apk add --no-cache socat
CMD socat -h
$ docker build -t local/socat — <socat.Dockerfile
$ # define local port forwarding
$ docker run -d --name socat-nip--network=container:todomvc \
local/socat socat TCP-LISTEN:4848,forkTCP:127.0.0.1:5858
$ # Open SSH Tunnel to gain access to serversport 5858.
$ # Set `SSH_KEY_FILE` to ssh key location oradd it to ssh-agent
$ #
$ # open an ssh tunnel, send it to the bg, andwait 20 seconds
$ # for connections, once all connections areclosed
$ # after 20 seconds then close the tunnel
$ ssh -i ${SSH_KEY_FILE} -f -oExitOnForwardFailure=yes \
-L 5858:127.0.0.1:5858ec2_user@some.ec2.host.com sleep 20
org.label-schema.vcs-ref——包含用于HEAD提交的短SHA org.label-schema.vcs-url——包含一个应用程序git存储库URL(可在git clone/pull中使用)
$ # get git repository url form Docker image
$ GIT_URL=$(docker inspect local/todomvc
| jq -r‘.[].ContainerConfig.Labels.”org.label-schema.vcs-url”’)
$ # get git commit from Docker image
$ GIT_COMMIT=$(docker inspect local/todomvc
| jq -r ‘.[].ContainerConfig.Labels.”org.label-schema.vcs-ref”’)
$
$ # clone git repository, if needed
$ git clone $GIT_URL
$ # set HEAD to same commit as server
$ git checkout $GIT_COMMIT
{ // For more information about Node.js debugattributes, visit: https://go.microsoft.com/fwlink/?linkid=830387
“version”: “0.2.0”,
“configurations”: [ {
“type”: “node”,
“request”: “attach”,
“name”: “Debug Remote Docker”,
“address”: “127.0.0.1”,
“port”: 5858, “localRoot”:
“${workspaceRoot}/”,
“remoteRoot”: “/usr/src/app/” }
] }
解析云原生与云计算本质区别,别再傻傻分不清楚了! Go 大败!Google 宣布 Fuchsia 终端开发只支持 C/C++/Dart 干货!从0到1教你打造一个令人上瘾的聊天机器人?
游戏之道
真实版“删库跑路”?程序员蓄意破坏线上生产环境!