使用`docker-compose run`时无法调试,但`docker-compose up`有效
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用`docker-compose run`时无法调试,但`docker-compose up`有效相关的知识,希望对你有一定的参考价值。
如果需要,我可以创建一个测试仓库。但是这个问题的要点是,当我使用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
文件中的服务名称。
一位同事在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文件中的自定义脚本。
以上是关于使用`docker-compose run`时无法调试,但`docker-compose up`有效的主要内容,如果未能解决你的问题,请参考以下文章
使用 docker-compose 与 docker run 的不同结果
Google Cloud Run 中的 docker-compose.yml
使用docker-compose简化docker run 运行参数