使用docker-compose run时无法调试,但是docker-compose up可以工作

时间:2018-10-05 21:58:50

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

如果需要,我可以创建一个测试仓库。但是,这个问题的要点在于,当我使用up命令时,我能够调试docker-compose创建的Docker映像。使用run命令时,我无法调试相同的容器。在这两种情况下,我都能看到我的应用启动。 vs代码调试器似乎在使用docker-compose run时似乎无法连接到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文件中我的服务的名称。

1 个答案:

答案 0 :(得分:0)

某同事在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文件中的自定义脚本。