本文的目的:

  • 更快的搭建Node.js开发调试环境
  • 保持开发环境和测试、生产环境一致,避免因环境不同造成的问题

准备本地环境

  • 目录结构如下所示,其中/data/src/config为配置文件目录,/data/src/web为工程代码目录(前后端代码在同一层级):
/data
└── src
    ├── config
    │   ├── config.json
    │   ├── interfaceConf.json
    │   └── update_config
    └── web
        ├── ams-pc
        ├── ams-pc-node
        ├── community-pc
        ├── community-pc-node
        ├── community-pos-api
        ├── login-android-node
        ├── login-node
        ├── login-node-v2
        ├── magicare-util
        └── magicare-v2
  • 为了可以远程调试代码,本地仍然需要安装Node.js,大家可以用nvm按需切换需要使用的Node版本,安装方法就自行google了。

安装mac版docker

  • 下载地址及安装说明点击这里,该安装包适合Mac OS Yosemite 10.10.3及以上系统,该版本不再需要安装虚拟机,若你的系统低于该版本,可参照该文

  • 启动docker

docker安装完成后在Launchpad点击以下图标


启动完成后在终端输入以下命令,查看是否成功:

➜  ~ docker --version
Docker version 17.03.1-ce, build c6d412e
  • 设置File Sharing
    点击任务栏docker图标

    Preferences->File Sharing将/data目录添加进去

  • 登录咱们的docker私有registry。

docker@magicare.me是一个只读权限的子账户(只能拉取镜像,不能推送镜像),所以在账户名后面多了一个‘@magicare’(企业名),密码会发到钉钉上。

➜  ~ docker login --username=docker@magicare.me@magicare --password=****** http://registry.cn-hangzhou.aliyuncs.com
Login Succeeded
  • 拉取Nodejs开发镜像
➜  ~ docker pull registry.cn-hangzhou.aliyuncs.com/magicare-web/centos-node-base:v8.0.0-redis

该镜像比较大(700+M),我本地有一个已经保存好的tar文件(centos-node-base-v8.0.0-redis.tgz),不想通过docker pull直接拉取镜像的话可以找我拿,然后用以下命令加载该镜像

➜  ~ docker load -i /{path}/centos-node-base-v8.0.0-redis.tgz
5f836674475c: Loading layer [==================================================>] 129.2 MB/129.2 MB
875a3938aa10: Loading layer [==================================================>] 12.55 MB/12.55 MB
Loaded image ID: sha256:7ab8a4f0b8ee1d54447c9d67a6acf3fa93f28129de6730b11d5e388e2d11a061
➜  ~ docker images
REPOSITORY                                                        TAG                 IMAGE ID            CREATED             SIZE
<none>                                                            <none>              7ab8a4f0b8ee        34 hours ago        745 MB
➜  ~ docker tag 7ab8a4f0b8ee registry.cn-hangzhou.aliyuncs.com/magicare-web/centos-node-base:v8.0.0-redis

使用docker load命令加载的镜像没有名称,用tag命令可以给镜像取个名字:docker tag <IMAGE_ID> xxx:xxx

该镜像内置了Node v8.0.0,Npm 5.0.0, redis-server,如果需要临时使用其他版本的Node,可以用该镜像启动容器后用nvm切换版本就ok了,当然,如果你需要长期使用其他版本的Node,也可以将修改后的容器commit到本地。(如果需要push到远程镜像仓库可以找我)

修改镜像的步骤:

➜  ~ docker run -it 7ab8a4f0b8ee /bin/bash
[root@4aa5997c9fe4 /]# nvm install xxxx
[root@4aa5997c9fe4 /]# exit
➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
4aa5997c9fe4        7ab8a4f0b8ee        "/bin/bash"         51 seconds ago      Exited (130) 1 second ago                       hardcore_noether
➜  ~ docker commit -m "我就是要用4.4.7" -a "zhukang@magicare.me" 4aa5997c9fe4 nodejs:v4.4.7
➜  ~ docker images
REPOSITORY                                                        TAG                 IMAGE ID            CREATED             SIZE
registry.cn-hangzhou.aliyuncs.com/magicare-web/centos-node-base   v8.0.0-redis        7ab8a4f0b8ee        34 hours ago        745 MB
nodejs                                                            v4.4.7              b47f95189d68        1 second ago        606 MB

docker run 从镜像启动容器时,可以指定镜像名称(registry.cn-hangzhou.aliyuncs.com/magicare-web/centos-node-base:xxxx)或者直接使用IMAGE_ID,通过docker images可以查看IMAGE_ID。

启动容器

以调试community-pc-node为例,我们需要在容器里启动community-pc-node(端口号3201),loginv2-node(端口号3008)

➜  ~ docker run -p 3201:3201 -p 3008:3008 -p 5858:5858  -e "NODE_ENV=staging" -d -v /data:/data 7ab8a4f0b8ee redis-server

docker run参数说明:
1、-p 指定容器和宿主的端口映射关系。此处我们需要将3201、3008以及5858(用于远程调试)端口映射出来。
2、-e 设置环境变量
3、-v 设置volume挂载路径,也就是把宿主机的目录挂载到容器内部。此处我们需要将宿主的/data目录挂载到容器的/data目录上。
4、-d 和redis-server组合,设置容器启动后,在后台运行redis-server
5、 7ab8a4f0b8ee 表示image id

如果要调试其他程序,则根据程序的监听端口修改-p参数即可。
以上命令执行完后,通过docker ps可以查看正在运行的容器:

➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                                    NAMES
d9af1bc29537        7ab8a4f0b8ee        "redis-server"      31 seconds ago      Up 29 seconds       0.0.0.0:3008->3008/tcp, 0.0.0.0:3201->3201/tcp, 0.0.0.0:5858->5858/tcp   hardcore_mestorf

好了,进到容器里面把我们要调试的程序启动起来:

➜  ~ docker exec -it d9af1bc29537 /bin/bash
[root@d9af1bc29537 /]# cd /data/src/web/login-node-v2/
[root@d9af1bc29537 login-node-v2]# nohup node bin/www &
[1] 176
[root@d9af1bc29537 login-node-v2]# nohup: ignoring input and appending output to 'nohup.out'

[root@d9af1bc29537 login-node-v2]# cd /data/src/web/community-pc-node/
[root@d9af1bc29537 community-pc-node]# nodemon --inspect=0.0.0.0:5858 bin/www
[nodemon] 1.11.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node --inspect=0.0.0.0:5858 bin/www`
Debugger listening on ws://0.0.0.0:5858/06b8de26-8b0c-4402-b287-4ce4c31e8bd9
For help see https://nodejs.org/en/docs/inspector
[2017-06-07 12:40:18.979] [INFO] console - [2017-06-07 12:40:18.978] [INFO] error - Redis connected of center_redis : [object Object]

我们启动了两个node程序,一个是loginv2,一个是community-pc-node,由于我们只想调试community-pc-node,所以将loginv2启动在后台不管。然后用nodemon(可以监控代码是否变动并自动重启node)启动community-pc-node,设置inspect端口用于远程调试。

vscode配置

必须使用最新版本的vscode,否则调试器无法连接到容器内部。

  • 用vscode打开community-pu-node所在目录

  • 点击调试->添加配置->选择Node.js,编辑配置如下:

{
    // Use IntelliSense to learn about possible Node.js debug attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "node",
            "request": "launch",
            "program": "${workspaceRoot}/bin/www",
            "stopOnEntry": false,
            "args": [],
            "cwd": "${workspaceRoot}",
            "preLaunchTask": null,
            "runtimeExecutable": "/Users/liluhong/.nvm/versions/node/v8.0.0/bin/node",
            "runtimeArgs": [
                "--nolazy"
            ],
            "env": {
                "NODE_ENV": "staging"
            },
            "sourceMaps": false
        },
        {
            "name": "Attach",
            "type": "node",
            "request": "attach",
            "port": 5858,
            "address": "127.0.0.1",
            "restart": true,
            "sourceMaps": false,
            "localRoot": "${workspaceRoot}/",
            "remoteRoot": "/data/src/web/community-pc-node/"
        }
    ]
}
  • 启动调试

访问程序主页,打个断点试试

进来了,妥妥的。

  • 修改代码,nodemon自动帮我们重启node


切换到启动community-pc-node的窗口可以看到:

好了,洗洗睡之前说个node v8.0.0里面package.json使用我们自己的模块需要修改的地方:

以前的写法:

"magicare-v2": "git+ssh://git@gitlab.magicare.me:node-modules/magicare-v2.git

v8.0.0的写法:

"magicare-v2": "git+ssh://git@gitlab.magicare.me/node-modules/magicare-v2.git

magicare.me后面的**‘:’要改成‘/’**