使用"docker-compose run"时无法调试,但"docker-compose up"有效



如果需要,我可以创建一个测试存储库。 但是这个问题的要点是,当我使用up命令时,我能够调试由 docker-compose 创建的 Docker 映像。 使用run命令时,我无法调试同一个容器。 在这两种情况下,我都可以看到我的应用程序启动。 使用 vs 代码调试器时似乎无法连接到 docker 容器docker-compose run.

这类似于我在 vs code 中的工作启动任务(调试器可以连接到的一个(:

{
"type": "node",
"request": "launch",
"name": "Docker: Debug",
"runtimeExecutable": "docker-compose",
"runtimeArgs": [
"up"
],
"port": 9229,
"stopOnEntry": true,
"restart": true,
"timeout": 30000,
"localRoot": "${workspaceRoot}",
"remoteRoot": "/app",
"outFiles": [ "${workspaceRoot}/dist/**/*.js" ],
"console": "externalTerminal",
"internalConsoleOptions": "neverOpen",
"protocol": "inspector",
"showAsyncStacks": true
}

我的 docker-compose 文件还在此处指定了一个命令(例如npm run start-app(,start-app具有以下定义:

nodemon --legacy-watch --watch ./dist/app1 --inspect=0.0.0.0:9229 --nolazy ./dist/app1/index.js

为什么我有问题:

我不希望在docker-compose.yml文件中指定命令,因为我有一个图像,里面有多个进程。 (每个进程将有一个容器,但它们都共享相同的映像。 我目前将其用于 kubernetes 部署和本地开发运行/调试。 我想通过使用指定的命令启动容器来在容器中运行和调试它。

我希望能够运行容器并指定要在 vs codelaunch.json文件中运行的应用程序,类似于以下内容:

{
"type": "node",
"request": "launch",
"name": "Docker: Debug",
"runtimeExecutable": "docker-compose",
"runtimeArgs": [
"run",
"all",
"npm",
"run",
"start-app"
],
"port": 9229,
"stopOnEntry": true,
"restart": true,
"timeout": 30000,
"localRoot": "${workspaceRoot}",
"remoteRoot": "/app",
"outFiles": [ "${workspaceRoot}/dist/**/*.js" ],
"console": "externalTerminal",
"internalConsoleOptions": "neverOpen",
"protocol": "inspector",
"showAsyncStacks": true
}

仅供参考,arg 列表中的all是指我在docker-compose.yml文件中的服务名称。

一位同事在docker-compose run文档中发现了以下代码片段:

。docker-compose run 命令不会创建服务配置中指定的任何端口。这可以防止端口与已打开的端口发生冲突。如果确实希望创建服务的端口并将其映射到主机,请指定 --service-ports 标志

所以我改变了启动任务的参数以包含这个标志,它现在可以工作了。

"runtimeArgs": [
"run",
"--service-ports",
"all",
"npm",
"run",
"start-app"
],

为了再次澄清,--service-ports告诉 docker compose 遵守我在 docker-compose.yml 文件中的端口映射,默认情况下up命令会这样做。all是 docker-compose.yml 文件中我的服务名称,命令的其余部分是npm run start-app,其中start-app是我在 package.json 文件中的自定义脚本。

相关内容

  • 没有找到相关文章

最新更新