【问题标题】:debugging doesn't work for docker compose with visual studio调试不适用于带有 Visual Studio 的 docker compose
【发布时间】:2022-01-13 16:10:50
【问题描述】:

我在 nginx 反向代理后面有一个 .net core 2.1 api,我在 Visual Studio 中使用 docker compose 设置。运行时,api 是可访问的(我有一个运行状况检查控制器,我可以调用它来验证),但我无法调试。看起来我的解决方案在构建后没有运行。但是我的容器已经启动并且可以访问。我正在使用 Visual Studio 2019。

这是我的文件夹结构:

  • ...
  • RestApi(项目文件夹文件夹)
  • Dockerfile
  • docker-compose.yml
  • 反向代理(文件夹)
    • Dockerfile
    • nginx.conf
  • ...

这些是文件(文件夹结构从上到下):

Dockerfile(用于 api):

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base
WORKDIR /app
#EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build
WORKDIR /src
COPY ["RestApi/RestApi.csproj", "RestApi/"]
COPY ["Services/Services.csproj", "Services/"]
COPY ["DataServices/DataServices.csproj", "DataServices/"]
COPY ["Entities/Entities.csproj", "Entities/"]
RUN dotnet restore "RestApi/RestApi.csproj"
COPY . .
WORKDIR "/src/RestApi"
RUN dotnet build "RestApi.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "RestApi.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

ENV ASPNETCORE_URLS http://+:5000
EXPOSE 5000

ENTRYPOINT ["dotnet", "RestApi.dll"]

docker-compose.yml:

version: '2.1'
services:
  restapi:
    build:
      context: ./
      dockerfile: Dockerfile
    expose:
      - "5000"
    #restart: always
  reverseproxy:
    build:
      context: ./ReverseProxy
      dockerfile: Dockerfile
    ports:
      - "80:80"
    #restart: always
    links :
      - restapi

Dockerfile(反向代理):

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf

nginx.conf:

worker_processes 4;

events { worker_connections 1024; }

http {
    sendfile on;

    upstream app_servers {
        server RestApi:5000;
        #server 172.17.0.1:5000;
    }

    server {
        listen 80;

        location / {
            proxy_pass         http://app_servers;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
    }
}

通过 Visual Studio 运行 docker-compose 时,docker 容器已正确创建,但我无法调试,也没有启动浏览器屏幕。在构建或运行时我没有收到任何错误。如果您需要更多信息,请询问。

【问题讨论】:

    标签: visual-studio debugging nginx .net-core docker-compose


    【解决方案1】:

    我发现出了什么问题。答案是此处发布的问题的解决方案。 https://developercommunity.visualstudio.com/content/problem/552563/debugger-silently-fails-to-attach-to-docker-compos.html

    基本上,当 dockerfile NOT 位于相应的 csproj 文件(项目文件)旁边(相邻)时,Visual Studio 将不会附加调试器。这是设计使然,因为可能存在您想要启动但不想调试的容器(反向代理、mysql 数据库等)。因此,当我将我的 Dockerfile 移动到 restapi 文件夹(与 csproj 文件相同的文件夹)并调整我的 docker-compose.yml 以在该文件夹中查找 dockerfile 时,在 Visual Studio 中调试工作。

    【讨论】:

      【解决方案2】:

      编辑2: Visual Studio (16.11.6+) 的补丁已发布。 你现在可以docker-compose enable-v2此答案现已过时。


      对于随机的谷歌用户,docker-compose 中有一个新问题(2021 年 10 月/11 月),它破坏了 Visual Studio 2019(但不是 VS2022 预览版)调试,其症状与此问题几乎相同。

      问题是,docker-compose config 将返回到 Build.ContextBuild.Dockerfile 的相对路径(它应该在 Build.Context 中返回绝对路径,在 Build.Dockerfile 中返回相对路径)

      现在的解决方案是docker-compose disable-v2 并清理并重建您的解决方案,直到发布新的 docker-compose 或 Visual Studio 补丁。

      详情见https://github.com/microsoft/DockerTools/issues/311https://github.com/docker/compose/issues/8760

      编辑:

      下一次 VS 更新是在 [2021 年 11 月 9 日]。它将得到修复。

      【讨论】:

        【解决方案3】:

        我添加这个不是为了解决这个问题,但它可能会帮助其他人。

        简而言之,我的问题是我的解决方案名称中有一个空格。

        我有一个最初在 VS Windows 上启动的大型解决方案。我唯一的猜测是,在 Windows 上,您可以在解决方案文件名中有一个空格。所以我的就像“我的 App.sln”。在我为项目添加 docker 支持之前,我在 VS Mac 上运行一切都没有问题。

        调试我的 docker-compose 项目将按预期完成所有操作,除了启动应用程序并附加调试器。它可以很好地启动容器,并且可以在 docker 桌面上运行。如果我在 /app/bin 文件夹中手动运行入口点,我可以启动应用程序并且它可以工作。因此,由于没有错误信息,因此很难诊断。

        最后我很生气,只是尝试提交新项目并添加 docker 支持。它工作并调试得很好。然后我尝试在解决方案名称中使用空格,VS Mac 在名称中说“no way dude”非法字符。所以,它指出我要修复我的真实项目。

        如果工具中的某个地方至少会针对路径或文件名中的空格(或任何非法字符)发出警告,从而阻止 docker 工作,那就太好了。我真的浪费了超过 15 个小时试图弄清楚这一点。

        【讨论】:

          猜你喜欢
          • 2021-09-28
          • 2021-01-25
          • 2017-03-25
          • 1970-01-01
          • 2018-11-27
          • 2019-08-09
          • 2021-12-08
          • 2012-08-24
          • 2017-08-20
          相关资源
          最近更新 更多