在 Docker 容器中调试 webpack-dev-server 应用程序

Posted

技术标签:

【中文标题】在 Docker 容器中调试 webpack-dev-server 应用程序【英文标题】:Debug webpack-dev-server application inside Docker container 【发布时间】:2020-06-14 21:38:26 【问题描述】:

我正在使用webpack-dev-server 在 Docker 容器中运行 Nestjs 应用程序。一切都已启动并正在运行,但我无法从我的 VS Code 实例中调试应用程序。我正在尝试在webpack.config.js 上使用此配置公开 9229 端口:

devServer: 
  host: '0.0.0.0',
  port: 9229,
,

当我在容器内运行netstat -l 时,我可以看到该节点没有监听 9229 端口:

我在 Dockerfile 和 docker-compose 文件中公开了端口 9229。 Dockerfile:

FROM node:12.16.1-alpine
WORKDIR /usr/src/app
COPY package.json yarn.lock ./
RUN yarn
COPY . .
EXPOSE 3000
EXPOSE 9229
CMD [ "yarn", "run", "start:debug"]

还有 docker-compose.yml 文件:

version: '3.7'
services:
    open-tuna-api:
        image: opentunaapi
        ports:
            - 3000:3000
            - 9229:9229
        volumes: 
            - ./dist:/usr/src/app/dist
            - ./:/usr/src/app
        networks:
            - open-tuna-network
        expose: 
            - 9229
networks:
    open-tuna-network:

这是我用来运行应用程序的脚本:

"start:debug": "webpack --config webpack.config.js && node --inspect=0.0.0.0:9229 node_modules/webpack-dev-server/bin/webpack-dev-server.js",

我的启动配置如下:


    "name": "Attach",
    "preLaunchTask": "compose-up",
    "stopOnEntry": true,
    "type": "node",
    "request": "attach",
    "port": 9229,
    "cwd": "$workspaceFolder", // the root where everything is based on
    "localRoot": "$workspaceFolder", // root of all server files
    "remoteRoot": "/usr/src/app", // workspace path which was set in the dockerfile
    "outFiles": ["$workspaceFolder/dist/**/*.js"], // all compiled javascript files
    "protocol": "inspector",
    "restart": true,
    "sourceMaps": true,
    "trace": "verbose",
    "address": "0.0.0.0",
    "skipFiles": [
        "<node_internals>/**"
    ],

当我在容器启动并运行的情况下运行此配置时,我收到一条消息说 VS Code 无法连接到进程。

所以,我的问题是: 有没有办法在 Docker 容器内调试在 webpack-dev-server 上运行的 JavaScript / TypeScript 应用程序?我的环境出了什么问题?

感谢您的帮助。

编辑

显然我的问题与 Docker 无关,因为我可以在容器外重现它。

【问题讨论】:

docker-compose ps 是否显示open-tuna-api 已在端口中绑定9229:9229?尝试将 vscode 配置中的地址更改为localhost127.0.0.1 更重要的是,它是否成功地提出了服务?开始调试后可以访问localhost:3000吗? 啊,我明白了,您的开发服务器端口与节点检查器端口相同。您需要将开发服务器的端口更改为其他端口(8080?9000?任何东西),并在 docker-compose 文件的ports 中传递它。它可能无法启动,因为节点的检查器服务器或 webpack 开发服务器在尝试绑定到 :9229 时失败 - 因为它们都尝试绑定到同一个端口。 嗨@cubrr,感谢您的帮助。是的,我可以访问 localhost:3000 上的应用程序。我尝试在 VS Code 配置中使用 localhost127.0.0.1。另外,我将所有文件的9229端口更改为9000,问题仍然存在。 看起来您正在尝试调试webpack-dev-server 本身,并且在构建捆绑包之后,开发服务器旨在避免webpack --config webpack.config.js 调用。服务器的入口文件是什么? 【参考方案1】:

查看您的配置并确保包含program 字段。并将其指向node_modules下的正确文件。

"program": "$workspaceRoot/node_modules/webpack-dev-server/bin/webpack-dev-server.js"

这应该能让你继续前进。

如果您想对此有更深入的了解,可以进行更长的对话,您可能会觉得有用 - 查看 this comment 在主要的 webpack-dev-server GitHub 存储库上。

【讨论】:

嗨@idancali,感谢您的回答。我试过了,但我遇到了同样的问题。另外,我收到来自 VS 代码的警告,说“程序”属性是不允许的。我会看看你发布的链接。

以上是关于在 Docker 容器中调试 webpack-dev-server 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 VS Code 在 Docker 容器中远程调试 python 代码

使用 VSCode 在 Docker 容器中调试 Typescript 文件

在 docker 容器内调试角度

无法在 docker 容器中远程调试 Java 9 Tomcat 9

在 Windows 容器中运行 Visual Studio 远程调试器(由 Docker 管理)

在 Docker 容器中调试 webpack-dev-server 应用程序