Uncategorized

如何 Debug Node APP 配合 Docker 與 VsCode

透過 vscode Debug 利用中斷點 (breakpoints) 讓開發、偵錯更聰明。

加快除錯速度,而不是用傳統的 console log 方式查看變數、物件內容找問題。

本篇教你如何用 vscode + node + docker 進行 runtime debug!

index

Foreword & Why

(理論上非 docker 也可以用這個方式)

不論是 pm2 或是 node 直接啟動 JS APP 都可以使用~

在 docker container 內啟動 node APP

(選擇你的 app 啟動方法)

  • 方法1: 透過 pm2 啟動
    • target script: ‘/var/www/express-test/bin/www’
    • node_args: “–inspect-brk=0.0.0.0”
  • 方法2: node 直接啟動
    • node app.js –inspect-brk=0.0.0.0
  • port 預設: 9229

ref.
https://nodejs.org/en/docs/guides/debugging-getting-started/#command-line-options


成功啟動 app 並進入 debug 監聽模式

可以看到 app 啟動後,debugger listening 提示訊息(如下圖)

(訊息開頭 NODE_1 後半段部份)


確認本機與 container 監聽是否串接成功

回到本機

在 chrome 瀏覽器,網址列輸入

chrome://inspect/

Discover network targets Configure…
新增監聽 localhost:9229

如果串接成功
下方
Remote Target 區塊,將出現 node 版本與相應 .js


與 vscode Debug 串接

於 vscode menu bar -> Debug -> open configuration 或 add configuration


編輯 vscode debug 監聽設定 launch.json

{
    'version': '0.2.0',
    'configurations': [
        {
            'name': 'Docker: Attach to Node',
            'type': 'node',
            'request': 'attach',
            'port': 9229,
            'address': 'localhost',
            'localRoot': '${workspaceFolder}',
            'remoteRoot': '/var/www/express-test',
            'protocol': 'inspector'
          }
    ]
}

以上需要注意並調整~

  • port 變更為前面 node inspect-brk 指定的 port
  • remoteRoot 變更為 docker container 內 node 啟用的時目錄位置(也就是專案根目錄)
  • e.g.
    啟動時用的路徑為
    /var/www/express-test/bin/www

    /var/www/express-test/app.js
    專案根目錄則為: /var/www/express-test

.
.
.

vscode 內 按 F5 Start Debugging

接著對程式碼下中斷點 (breakpoints)
https://code.visualstudio.com/docs/editor/debugging#_breakpoints

到 chrome 相對應的頁面,重新整理或執行

碰到中斷點就會自動回到 vscode

可以用滑鼠查看中斷點前變數內容


Conclusion 結語

  • 利用中斷點 debug 可以即時知道變數狀況和 function 動作~
  • 需要注意透過 pm2 啟動的情況下
    不能使用 exec_mode = cluster,instances 應該 = 1
    理論上應該是可行的,只是我沒則試
    但因為是本機 debug 所以我覺得可以先把 cluster 關掉

.
.

Ref.

https://blog.risingstack.com/how-to-debug-a-node-js-app-in-a-docker-container/

可樂

Recent Posts

plain PHP 搭配 Slack 進行錯誤追蹤、回報(Error Tracking、Error Handling)

錯誤追蹤、回報非常重要,看到的錯誤才知道怎麼修。現今 PHP 流行的 Laravel 有很好的 Error Tracking, Error Handling。但 plain PHP 怎麼辦呢? 在 production 為了安全考量會設定…

4 years ago

Drone CI/CD 配合 Github 使用 Rsync 進行 Deploy

jenkins、circleci、travis 或 Gitlab CI 皆為目前暫知名的 CI/CD 服務,各自缺點也不言而喻...過於肥大、收費略高(?)、速度不夠快執問題...此時使用 go language 開發的 Drone 就出現啦,完全 docker 容器化的運行方式讓整個 CI…

4 years ago

Nginx brotli 設定

網頁壓縮技術中 gzip 很好用,deflate 己經過時,但你聽過 brotli 嗎? 有著比 gzip 更好、更快的壓縮效率。看起來利大於弊有什麼不用他的理由嗎?簡單從優、缺點來看 brotli!到底 brotli 布羅特利是什麼、如何設定呢。 目前大多的 web server…

4 years ago

本機使用 Docker 容器內 PHP (wrapper/expose PHP)

為什麼要讓本機使用 Docker 內 PHP? 情境... docker 容器內用的是 PHP 7.4 但你的開發本機還在跑 PHP 5.6 或是更舊,因為 dockerize 的關係會將所有相關環境都轉移到…

4 years ago

為什麼你需要密碼管理工具

為什麼你需要密碼管理工具現代人一天下來需要輸入多少組密碼,工作與生活己經和密碼密不可分! 除了足夠全安的密碼,密碼記錄、儲存的方式又足夠安全嗎?密碼管理工具可以帶來什麼幫助呢? 為什麼你需要密碼管理工具 資安問題!!大多人說著沒做壞事不怕被偷資料、監聽。嚴重曝露出現代人的基本科技素養的低落和無知 🤯 密碼的使用無所不在!! 行動裝置的普及,APP 、手機遊戲、銀行帳戶所有和生活相關的東西都需要密碼!!facebook, line 只要打開 APP 也會輸入密碼只是他是自動輸入、一般情況不可視 (auth token) 一般人最常發生的密碼資安問題…

4 years ago

簡單使用 Mysql Partition 優化查詢

mysql 資料表分區 mysql table partition 從架構上調整 mysql 的查詢效率。mysql DB 的優化可以簡單也能複雜,除了調整設定值。也可以透過水平分割(Horizontal Partitioning)、垂直分割(Vertical Partitioning) 分庫或分表將資料分散儲存減少資料搜尋、group by 時的效能消耗。拆開批次處理,理論上效率都會變好,本文就水平分割的…

4 years ago