无法在 docker 中调试 nodejs 应用程序
Unable to debug a nodejs app inside of docker
我正在尝试使用 Nodemon 从 Docker 内部调试 Nodejs 应用程序。
我可以使用 Visual Studio 代码的自动附加功能在没有 Docker 的情况下使用 Nodemon 调试我的应用程序。
但是当我构建我的 docker 图像并通过 npm 运行 dev:docker:debug 启动容器时,我得到了以下日志,但没有附加调试器。这可能与音量有关,但我无法弄清楚...
Successfully built 857d9da57565
Successfully tagged app:dev
Creating docker_app_1 ... done
Attaching to docker_app_1
app_1 |
app_1 | > app@1.0.0 dev:debug /usr/src/app
app_1 | > nodemon --config nodemon.json --env=development
app_1 |
app_1 | [nodemon] 2.0.2
app_1 | [nodemon] to restart at any time, enter `rs`
app_1 | [nodemon] watching dir(s): src/**/*
app_1 | [nodemon] watching extensions: ts
app_1 | [nodemon] starting `cross-env NODE_OPTIONS='--inspect=0.0.0.0:5858' ts-node -r tsconfig-paths/register ./src --env=development`
app_1 | Debugger listening on ws://0.0.0.0:5858/k3h42h4-h49d-4f00-adj877-60f6731548787
app_1 | For help, see: https://nodejs.org/en/docs/inspector
app_1 | Service started at ports:3000
文件夹结构
App
|-- docker
| |-- docker-compose.yml
| |-- Dockerfile
| `-- .dockerignore
|-- nodemon.json
|-- package.json
|-- tsconfig.json
|-- tslint.json
`-- src
`-- index.ts
index.ts
import express, { Request, Response } from "express";
const app = express();
const port = process.env.PORT || 3000; // default port to listen
// define a route handler for the default home page
app.get("/", (req: Request, res: Response) => {
res.send("Hello worlds!");
});
// start the Express server
app.listen(port, () => {
console.log(`Service started at ports:${port}`);
});
docker-compose.yml
# docker-compose.yml
version: "3"
services:
app:
image: app:dev
build:
context: ../
dockerfile: ./docker/Dockerfile
ports:
- 3000:3000
volumes:
- ../src:/usr/src/app/src/
Docker文件
FROM node:12-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . ./
CMD [ "npm", "run", "dev:debug" ]
package.json
{
"name": "app",
"version": "1.0.0",
"description": "API to receive data",
"author": "Nikhil Gupta",
"main": "./dist/index.js",
"scripts": {
"dev:debug": "nodemon --config nodemon.json --env=development",
"dev:docker:debug": "docker-compose -f ./docker/docker-compose.yml up --build"
},
"dependencies": {
"cross-env": "^6.0.3",
"express": "^4.17.1",
"ts-node": "^8.5.4",
"tsconfig-paths": "^3.9.0",
"tslib": "^1.10.0"
},
"devDependencies": {
"@types/express": "^4.17.2",
"@types/node": "^12.12.21",
"nodemon": "^2.0.2",
"tslint": "^5.20.1",
"typescript": "^3.7.4"
}
}
nodemon.json
{
"watch": ["src"],
"ext": "ts",
"ignore": ["src/public"],
"inspect": true,
"exec": "cross-env NODE_OPTIONS='--inspect=0.0.0.0:5858' ts-node -r tsconfig-paths/register ./src"
}
由于调试器监听容器内的 5858 端口,如果你想从容器外部连接到它,你需要将它绑定到主机上的一个端口,就像你在 3000 端口上所做的那样你的撰写文件。
# docker-compose.yml
version: "3"
services:
app:
image: app:dev
build:
context: ../
dockerfile: ./docker/Dockerfile
ports:
- 3000:3000
- 5858:5858
volumes:
- ../src:/usr/src/app/src/
正如@ykit9 在评论中提到的,我做了以下操作
1) 将端口 5858 添加到我的 docker-compose.yml
# docker-compose.yml
version: "3"
services:
app:
image: app:dev
build:
context: ../
dockerfile: ./docker/Dockerfile
ports:
- 3000:3000
- 5858:5858
volumes:
- ../src:/usr/src/app/src/
2) 在 VS Code 的 launch.json 文件中添加了以下配置。
{
"type": "node",
"request": "attach",
"name": "Attach to Docker",
"protocol": "auto",
"port": 5858,
"restart": true,
"localRoot": "${workspaceFolder}/src",
"remoteRoot": "/usr/src/app/src"
}
我正在尝试使用 Nodemon 从 Docker 内部调试 Nodejs 应用程序。
我可以使用 Visual Studio 代码的自动附加功能在没有 Docker 的情况下使用 Nodemon 调试我的应用程序。
但是当我构建我的 docker 图像并通过 npm 运行 dev:docker:debug 启动容器时,我得到了以下日志,但没有附加调试器。这可能与音量有关,但我无法弄清楚...
Successfully built 857d9da57565
Successfully tagged app:dev
Creating docker_app_1 ... done
Attaching to docker_app_1
app_1 |
app_1 | > app@1.0.0 dev:debug /usr/src/app
app_1 | > nodemon --config nodemon.json --env=development
app_1 |
app_1 | [nodemon] 2.0.2
app_1 | [nodemon] to restart at any time, enter `rs`
app_1 | [nodemon] watching dir(s): src/**/*
app_1 | [nodemon] watching extensions: ts
app_1 | [nodemon] starting `cross-env NODE_OPTIONS='--inspect=0.0.0.0:5858' ts-node -r tsconfig-paths/register ./src --env=development`
app_1 | Debugger listening on ws://0.0.0.0:5858/k3h42h4-h49d-4f00-adj877-60f6731548787
app_1 | For help, see: https://nodejs.org/en/docs/inspector
app_1 | Service started at ports:3000
文件夹结构
App
|-- docker
| |-- docker-compose.yml
| |-- Dockerfile
| `-- .dockerignore
|-- nodemon.json
|-- package.json
|-- tsconfig.json
|-- tslint.json
`-- src
`-- index.ts
index.ts
import express, { Request, Response } from "express";
const app = express();
const port = process.env.PORT || 3000; // default port to listen
// define a route handler for the default home page
app.get("/", (req: Request, res: Response) => {
res.send("Hello worlds!");
});
// start the Express server
app.listen(port, () => {
console.log(`Service started at ports:${port}`);
});
docker-compose.yml
# docker-compose.yml
version: "3"
services:
app:
image: app:dev
build:
context: ../
dockerfile: ./docker/Dockerfile
ports:
- 3000:3000
volumes:
- ../src:/usr/src/app/src/
Docker文件
FROM node:12-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . ./
CMD [ "npm", "run", "dev:debug" ]
package.json
{
"name": "app",
"version": "1.0.0",
"description": "API to receive data",
"author": "Nikhil Gupta",
"main": "./dist/index.js",
"scripts": {
"dev:debug": "nodemon --config nodemon.json --env=development",
"dev:docker:debug": "docker-compose -f ./docker/docker-compose.yml up --build"
},
"dependencies": {
"cross-env": "^6.0.3",
"express": "^4.17.1",
"ts-node": "^8.5.4",
"tsconfig-paths": "^3.9.0",
"tslib": "^1.10.0"
},
"devDependencies": {
"@types/express": "^4.17.2",
"@types/node": "^12.12.21",
"nodemon": "^2.0.2",
"tslint": "^5.20.1",
"typescript": "^3.7.4"
}
}
nodemon.json
{
"watch": ["src"],
"ext": "ts",
"ignore": ["src/public"],
"inspect": true,
"exec": "cross-env NODE_OPTIONS='--inspect=0.0.0.0:5858' ts-node -r tsconfig-paths/register ./src"
}
由于调试器监听容器内的 5858 端口,如果你想从容器外部连接到它,你需要将它绑定到主机上的一个端口,就像你在 3000 端口上所做的那样你的撰写文件。
# docker-compose.yml
version: "3"
services:
app:
image: app:dev
build:
context: ../
dockerfile: ./docker/Dockerfile
ports:
- 3000:3000
- 5858:5858
volumes:
- ../src:/usr/src/app/src/
正如@ykit9 在评论中提到的,我做了以下操作
1) 将端口 5858 添加到我的 docker-compose.yml
# docker-compose.yml
version: "3"
services:
app:
image: app:dev
build:
context: ../
dockerfile: ./docker/Dockerfile
ports:
- 3000:3000
- 5858:5858
volumes:
- ../src:/usr/src/app/src/
2) 在 VS Code 的 launch.json 文件中添加了以下配置。
{
"type": "node",
"request": "attach",
"name": "Attach to Docker",
"protocol": "auto",
"port": 5858,
"restart": true,
"localRoot": "${workspaceFolder}/src",
"remoteRoot": "/usr/src/app/src"
}