【问题标题】:Can't debug when using `docker-compose run`, but `docker-compose up` works使用`docker-compose run`时无法调试,但`docker-compose up`有效
【发布时间】:2018-10-05 21:58:50
【问题描述】:

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

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

{
  "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 代码launch.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 文件中我的服务的名称。

【问题讨论】:

    标签: node.js docker visual-studio-code docker-compose vscode-debugger


    【解决方案1】:

    一位同事在docker-compose run的文档中发现了以下sn-p:

    ...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 文件中的自定义脚本。

    【讨论】: