로컬에서 개발을 하는 것처럼 컨테이너에서 개발을 하기 위해서는 디버거가 필요합니다.
NodeJS의 경우 내장된 디버거가 있습니다.
이를 사용하기 위해서는 --inspect 옵션을 사용하면 됩니다.
pacakage.json파일에 script에 아래와 같이 명령어를 작성하면
'npm run debug-docker'을 통해 내장된 디버거가 같이 실행됩니다.
"debug-docker": "nodemon --inspect=0.0.0.0:9229 ./src/index.js",
참고로 0.0.0.0은 모든 네트워크에서 해당 애플리케이션에 대해 디버거로 접속 가능한 옵션이기 때문에 실제 사용할 때는 주의가 필요합니다.
docker-compose.yml파일에는 아래와 같이 작성하면 됩니다.
services:
api-node:
command:
- "npm"
- "run"
- "debug-docker"
ports:
- "3000:3000"
# inspect debug port
- "9229:9229"
이렇게 하고 docker-compose.yml을 실행하면 디버거도 같이 실행됩니다.
대부분 디버깅용 파일과 개발 파일은 분리하기 때문에 아래와 같이 실행하면 디버깅이 가능합니다.
docker-compose -f docker-compose-dev.yml -f docker-compose-debug.yml up --build
VS코드에서 원격으로 컨테이너에 디버깅을 할 수 있도록 만들 수 있습니다.
launch.json파일에 다음과 같이 설정하면 됩니다.
{
"version": "0.2.0",
"configurations": [
{
"name": "Docker: Attach to Node",
"type": "node",
"request": "attach",
"localRoot": "${workspaceFolder}/docker-course/devops-directive-docker-course/05-example-web-application/api-node",
"remoteRoot": "/usr/src/app",
"port": 9229
},
{
"name": "Docker: Attach to Golang",
"type": "go",
"debugAdapter": "dlv-dap",
"mode": "remote",
"request": "attach",
"port": 4000,
"remotePath": "/app",
"substitutePath": [
{
"from": "${workspaceFolder}/docker-course/devops-directive-docker-course/05-example-web-application/api-golang",
"to": "/app"
}
]
}
]
}