요즘에는 로컬 개발 환경에서도 서버를 도커에 올려 사용하는 경우가 많습니다.
서버는 도커에 올라가있는데 로컬에 깔려 있는 VS Code IDE로 어떻게 디버깅을 할 수 있을까요?
Node.js는 이런 경우 원격 디버깅을 할 수 있도록 디버깅용 API를 정의하고 있습니다.
Node 버전 7 이전은 legecy Debugger API를, 8 버전 이후부터는 Inspecter API를 사용합니다. Inspecter API 기준으로 설명하겠습니다.
--inspect 로 Node.js를 실행하면 디폴트로 127.0.0.1:9229 에서 디버깅 요청을 listen 합니다.node --inspect=0.0.0.0:9229
//.vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Docker: Attach to Node",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"localRoot": "${workspaceFolder}",
"remoteRoot": "usr/src/app",
"restart": true,
"sourceMaps": true,
"skipFiles": ["<node_internals>/**", "${workspaceFolder}/node_modules/**"]
}
]
}
VS 코드 왼쪽 메뉴에서 디버거를 선택하고, 설정파일의 name 속성에 설정한 이름을 가진 설정을 선택해 디버깅을 실행합니다.

도커 로그에 다음과 같은 메세지가 뜨면 디버거가 연결되었다는 뜻입니다.
Debugger attached.
이렇게 디버거와 연결은 할 수 있지만 실제로 디버깅하는 데 불편함이 따릅니다. 로컬에서 수정한 코드가 도커에 바로 반영되지 않아 코드를 수정하면 도커를 재시작해야 합니다.
좀 더 편리하게 디버깅 하기 위해 도커 볼륨 + nodemon과 ts-node를 사용해 문제를 해결할 수 있습니다.
nodemon은 소스 코드의 변경사항을 감지해서 자동으로 재시작해주는 툴입니다.
services:
server:
...
volumes:
- ./src:/usr/src/app/src
로컬 경로:도커 경로 형식으로 로컬의 폴더와 도커 컨테이너 내부의 폴더를 매핑할 수 있습니다. src 폴더를 매핑해줍니다. npm install -d nodemon
"start:debug:watch": "nodemon --watch src -e ts --exec \"node --inspect=0.0.0.0:9229 -r ts-node/register src/main.ts\"",
nodemon --watch 로 파일 변경을 모니터링해 재시작하도록 합니다.src -e ts는 ts 파일을 감시한다는 뜻입니다.--exec로 재시작 할때마다 실행할 명령어를 입력합니다. --inspect 모드로 노드를 시작하고, 원하는 포트와 호스트를 입력합니다. ts-node는 컴파일 없이 ts 파일을 직접 실행하도록 해주는 툴입니다.
개발 단계에서 빌드 과정 없이 즉시 변경사항을 확인할 수 있어 편리합니다.
위의 명령어에서,
-r ts-node/register로 ts-node를 사용해 ts 코드를 바로 사용하도록 합니다.src/main.ts는 시작지점 파일명입니다.