Từng bước debug NodeJs trong Docker không dùng console.log

Trong bài này, tôi sẽ hướng dẫn cách gỡ lỗi ứng dụng NodeJS trong Docker mà không cần dùng console.log , ta có thể debug từng dòng code , từng giá trị biến quá break point.


1064

Cách sử dụng trình kiểm tra Node Inspector

Nếu bạn chủ yếu sử dụng printf, aka caveman debugging, có thể rất khó để tìm đúng giá trị vào đúng thời điểm app NodeJS.

Mọi thứ thậm chí còn tồi tệ hơn nếu bạn phải xây dựng lại image container của mình để thêm console.logvào nó. Có thể dễ dàng hơn rất nhiều khi image được tạo một lần và ta có thể kiểm tra các biến trong khi nó đang chạy. Để hiểu rõ hơn những gì chúng ta sẽ làm ở đây, bạn cần làm quen với node inspect

Để chạy ứng dụng NodeJS của bạn ở chế độ gỡ lỗi, chỉ cần thêm inspect sau node:

$ node inspect index.js
< Debugger listening on ws://127.0.0.1:9229/5adb6217-0757-4761-95a2-6af0955d7d25
< For help, see: https://nodejs.org/en/docs/inspector
< Debugger attached.
Break on start in index.js:1
> 1 (function (exports, require, module, __filename, __dirname) { const http = require('http')
  2 const PORT = process.env.PORT || 3000
  3
debug>

Khi bạn chạy ở chế độ inspect, nó luôn dừng ở dòng đầu tiên, chờ bạn tương tác với nó. Tuy nhiên, nếu bạn đã quen với việc tương tác với trình gỡ lỗi của mình bằng GUI, bạn có thể dùng chrome và đến chrome://inspect.

Bạn sẽ thấy một cái gì đó như thế này:

Node.js với Trình kiểm tra Chrome Docker

Nhập phải chọn inspect và bạn sẽ thấy trình gỡ lỗi dành cho nhà phát triển Chrome.

Trình gỡ lỗi Chrome Dock Node.js

Bây giờ bạn có thể sử dụng trình gỡ lỗi như bạn muốn. Đã đến lúc bọc ứng dụng của chúng ta trong một container.

Debug NodeJS trong Docker container

Trước tiên, chúng ta sẽ cần tạo Dockerfile,

FROM node
COPY package.json package.json
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "."]

và một docker-compose.yaml

version: '3.6'
services:
  app:
    build: .
    ports:
      - "3000:3000"

Bây giờ nếu bạn chạy docker-compose up, bạn sẽ có thể xem kết quả tại url http://localhost:3000.

Bước tiếp theo là đưa “port” debug ra thế giới bên ngoài. Đầu tiên, hãy tạo một debug-compose.yaml.

version: '3.6'
services:
  app:
    build: .
    ports:
      - "3000:3000"
      - "9229:9229"
    command:
      - node
      - "--inspect-brk=0.0.0.0"
      - "."

Chúng ta đã mở cổng 9229, đó là cổng gỡ lỗi của các ứng dụng NodeJS. Chúng ta cũng ghi đè lệnh đã chỉ định trong Dockerfile. Đối --inspect-brk=0.0.0.0số thực hiện hai điều khác nhau:

  1. --inspect nói với NodeJS rằng chúng ta muốn chạy ứng dụng của mình ở chế độ gỡ lỗi.
  2. Bằng cách thêm -brkchúng ta cũng đảm bảo rằng ứng dụng dừng ở dòng đầu tiên.
  3. Thêm =0.0.0.0mở ra trình gỡ lỗi cho các kết nối từ bất kỳ IP nào.

Theo mặc định, inspector bị ràng buộc bởi 127.0.0.1điều này quan trọng, vì chúng ta thường không muốn cho phép mọi người từ khắp nơi trên thế giới gắn trình gỡ lỗi vào ứng dụng của mình. Tuy nhiên, container là một máy chủ khác có IP khác với máy chủ của chúng ta, vì vậy sẽ không thể truy cập được. 

Lưu ý: đừng dại dột làm điều này trên production nhé :v

Vì lý do này, chắc chắn rằng đó là một file khác với file mặc định docker-compose.yaml ( dùng chạy trên server ) .

Công cụ Docker Node.js

Gỡ lỗi với Visual Studio Code

Đầu tiên, ta nhìn vào thanh menu và đến tab gỡ lỗi ( chổ có hình con crep – và bắt đầu farm :v )

Bảng mã VSCode Docker NodeJS

sau đó nhấp vào biểu tượng bánh răng

Cài đặt trình gỡ lỗi Dock NodeJS

từ danh sách bật lên, chọn docker (đảm bảo, bạn đã cài đặt tiện ích mở rộng Docker )

NodeJS Docker Trình gỡ lỗi VSCode Popup

nó sẽ tạo launch.json NodeJS trong .vscodethư mục dự án trông như thế này:

Docker NodeJS Launch.json

Ở đây ta cần thay đổi thuộc tính “remoteRoot” cho phù hợp – tuỳ vào môi trường của bạn

{
  "name": "Docker: Attach to Node",
  "type": "node",
  "request": "attach",
  "port": 9229,
  "address": "localhost",
  "localRoot": "${workspaceFolder}",
  "remoteRoot": "/",
  "protocol": "inspector"
}

Bây giờ, nếu bạn nhấn F5 trên bàn phím, bạn sẽ được nhắc với trình gỡ lỗi mà bạn đã quen với VSCode. Nhấn F5 một lần nữa, để cho máy chủ bắt đầu nghe. Nếu bạn đặt một break point ở đâu đó và gọi máy chủ tại http://localhost:3000bạn sẽ thấy ngay điều kỳ diệu

Trình gỡ lỗi Node.js Docker VSCode

Suy nghĩ cuối cùng về gỡ lỗi NodeJS

Các công nghệ container như Kubernetes, AWS ECS, Docker Swarm và các công nghệ khác đang ngày càng lan rộng cùng tất cả những tiện ích nó mang đến, có thể thấy rõ rằng thời của container đang đến.

Trong trường hợp bạn cần hướng dẫn với Docker, Kubernetes, microservice hoặc NodeJS, vui lòng inbox tôi qua messenger tại góc phải dưới màn hình.

Tham khảo thêm về log NodeJS tại đây : Logs NodeJS là gì ? Và tại sao nên dùng ?

Chúc bạn may mắn và ngày càng có nhiều lỗi để debug :v


Like it? Share with your friends!

1064