通过 docker-compose 调试停止工作

Debugging through docker-compose stopped working

在 Visual Studio 2019 年创建了一个小型 .Net 5.0 应用程序,并使用 linux 容器为其添加了 docker-compose 容器编排支持。我将 docker-compose 项目设置为 Visual Studio 中的默认启动应用程序,这两天一切都很好,直到我决定更改我的配置,以便我的容器有一个稳定的端口号而不是它随机变化。

我不确定我做了什么,但是 Visual Studio 不再附加到容器,通常在容器启动时打开的浏览器 window 不再附加。容器是 运行ning,但应用程序不响应我正在尝试的新端口号或旧端口号。

代码在 VS 中构建良好,Dockerfile 构建成功,并且 Visual Studio 中的 docker-compose up 命令 运行s 很好。

我的 docker-compose 文件中有 portainer 运行ning,我可以看到容器是 运行ning,但它没有生成任何日志。我使用 portainer 登录到我的 运行ning 容器并像这样安装了 procps 包:apt-get update; apt-get -y install procps。当我 运行 ps 我看到我的应用程序实际上不是 运行ning.

root@46c62bf07df3:/app# ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0  2195     0  20   0   3868  3280 do_wai Ss   pts/2      0:00 bash
0     0  2216  2195  20   0   7556  1212 -      R+   pts/2      0:00 ps l

更新:每当牛放屁时,这种情况就会继续发生,所以我不得不继续解决这个问题。我终于找到了这份报告,它说当 docker-compose v2 启用时这是一个已知的内部问题。

解决方法是使用 docker-compose disable-v2 禁用 V2。 您可以使用 docker-compose --version 验证它是否已禁用。 他们声称真正的修复正在 2021 年 10 月中旬进行,并将很快发布。他们还声称 Visual Studio 2022 预览版已经包含修复程序。

https://developercommunity2.visualstudio.com/t/Debugging-docker-compose-VS-cant-attac/1551330?entry=problem&ref=native&refTime=1636020527854&refUserId=09da1758-2dd4-4352-bba5-ea1f5e163268

我还写了这个 powershell 脚本来清除所有垃圾 VS 正在缓存所以没有任何卡住。

$ErrorActionPreference = 'Stop'

# delete various folders from the root folder
if ((Test-Path -Path .vs)) {
    Remove-Item .vs -recurse -force -Verbose
}
if ((Test-Path -Path obj)) {
    Remove-Item obj -recurse -Verbose
}
if ((Test-Path -Path bin)) {
    Remove-Item bin -recurse -Verbose
}

# delete various folders recursively
$currentfolder = Get-Location
Get-ChildItem -Path $currentfolder -Directory -Include bin, obj -Recurse | Remove-Item -Force -recurse -Verbose
Get-ChildItem -Path $currentfolder -File -Include docker-compose.dcproj.user -Recurse | Remove-Item -Force -recurse -Verbose
Get-ChildItem -Path $currentfolder -Directory -Recurse -Attributes H | Where-Object { $_.Name.Contains('.vs') } | Remove-Item -Force -recurse -Verbose

# delete all volumes except those with the keep label
#docker volume prune --filter "label!=keep" -f

Original answer

想出了如何让它再次工作,但我仍然不知道它为什么会发生,它似乎 运行domly fubar 时不时地。

我最后创建了另一个临时启动应用程序并向其添加容器编排,这样我就可以看看它是否会 运行 而且 将文件与我的真实应用程序进行比较。新的临时应用程序确实 运行 在 docker-compose 中成功,所以我开始查看各种文件的差异 在两个应用程序之间。所有这些都是小差异,即使我更新了我的真实应用程序以匹配临时应用程序的文件,它仍然不会 运行.

我注意到,在 Visual Studio 2019 年,您实际上可以看到有关 运行ning docker 容器的详细信息,并且还注意到它向我显示了温度 应用程序和我关心的真实应用程序。所以我浏览了两者的所有容器详细信息,并缩小了一个名为 com.microsoft.visualstudio.debuggee.arguments 的标签 这显然在我的真实应用程序容器中丢失了一些东西。

临时应用程序将该标签设置为:

--additionalProbingPath /root/.nuget/packages "/app/bin/Debug/net5.0/Test.dll"

但我的真实应用程序却有这个,它缺少 start/debug 我的应用程序所需的程序集路径。

--additionalProbingPath /root/.nuget/packages ""

Visual Studio 创建一个文件 obj\Docker\docker-compose.vs.debug.g.yml 并在调试时将其传递给 docker-compose,并且该标签缺少启动我的应用程序和 运行宁.

我不知道为什么 Visual Studio 正在篡改这个文件,但它继续 运行 经常发生。

这些是最终让它工作的步骤。

  1. 关闭 Visual Studio
  2. 的所有实例
  3. 手动删除以下文件夹
.vs
bin
obj
  1. 手动删除项目中的所有 .user 个文件。
  2. 打开 Docker 桌面并删除由您的项目创建的 docker-compose 堆栈。
  3. 删除项目的 docker 个图像
  4. 加载您的项目并再次尝试 运行。

Visual Studio 这次应该用正确的位重新生成上面提到的文件,并且应该附加到容器。