【问题标题】:Debugging through docker-compose stopped working通过 docker-compose 调试停止工作
【发布时间】:2021-10-25 07:02:44
【问题描述】:

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

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

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

我的 docker-compose 文件中正在运行 portainer,我可以看到容器正在运行,但它没有产生任何日志。我使用 portainer 登录到我正在运行的容器并安装了 procps 包,如下所示:apt-get update; apt-get -y install procps。当我运行 ps 时,我发现我的应用实际上并未运行。

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

【问题讨论】:

    标签: visual-studio docker docker-compose containers visual-studio-2019


    【解决方案1】:

    更新:每当一头牛放屁时,这种情况就会继续发生,所以我不得不继续解决这个问题。我终于找到了这个报告,它说它是启用 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
    

    原答案

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

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

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

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

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

    但我真正的应用程序却有这个,它缺少启动/调试我的应用程序所需的程序集的路径。

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

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

    我不知道为什么 Visual Studio 会 fubaring 这个文件,但它继续随机发生。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多