首页 文章

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

提问于
浏览
0

如果需要,我可以创建一个测试仓库 . 但是这个问题的要点是,当我使用 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 文件中我的服务名称 .

1 回答

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

相关问题