【问题标题】:Breakpoints not hit when using docker-compose for asp.net core project将 docker-compose 用于 asp.net 核心项目时未命中断点
【发布时间】:2020-12-26 18:05:14
【问题描述】:

当我使用 docker 时,我正在努力思考如何调试应用程序。我找到了这个文档,它没有产生预期的结果:https://code.visualstudio.com/docs/containers/docker-compose

我做了以下事情:

  1. dotnet new mvc
  2. 在 VS Code 内部 ctrl + shift + p --> 将 Docker 文件添加到工作区
  3. 修改 docker-compose.debug.yml 以支持 SSL
metricdemo:
  image: metricdemo
  build:
    context: .
    dockerfile: Dockerfile
  ports:
    - 80
    - 5000:443
  environment:
    - ASPNETCORE_ENVIRONMENT=Development
    - ASPNETCORE_URLS=http://+:80;https://+:443
    - ASPNETCORE_Kestrel__Certificates__Default__Password=password
    - ASPNETCORE_Kestrel__Certificates__Default__Path=/root/.dotnet/https/aspnetcore-cert.pfx
  volumes:
    - C:\cert\:/root/.dotnet/https
    - ~/.vsdbg:/remote_debugger:rw

下一步是创建启动配置,以便附加调试器:

{
    "name": "Docker .NET Core Attach (Preview)",
    "type": "docker",
    "request": "attach",
    "platform": "netCore",
    "netCore": {
        "debuggerPath": "/remote_debugger/vsdbg"
    },
    "sourceFileMap": {
        "/src": "${workspaceFolder}"
    }
}

我尝试了使用和不使用 debuggerPath 集的两种组合。

在此之后,我使用 docker-compose 启动

docker-compose -f "docker-compose.debug.yml" up --build

然后我附加调试器。

更新调试不起作用的原因其实是Dockerfile本身:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src
COPY ["MetricDemo.csproj", "./"]
RUN dotnet restore "./MetricDemo.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MetricDemo.csproj" -c Release -o /app/build

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MetricDemo.dll"]

构建和发布这两个层都是使用发布模式构建的。将此设置为调试,就可以了。现在引出了一个问题:如何从 docker-compose 控制这个变量,以便我可以从 docker-compose.debug.yml 构建调试模式并从 docker-compose.yml 构建发布配置?我真的不希望一个项目有 2 个 docker 文件。

【问题讨论】:

    标签: docker asp.net-core visual-studio-code docker-compose


    【解决方案1】:

    我已经解决了我的问题,方法是用 ARG 替换硬编码的“Release”配置,这是 vs 代码添加的:

    FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
    WORKDIR /src
    COPY ["MetricDemo.csproj", "./"]
    RUN dotnet restore "./MetricDemo.csproj"
    COPY . .
    WORKDIR "/src/."
    ARG Mode=Debug
    RUN echo "$Mode"
    RUN dotnet build "MetricDemo.csproj" -c $Mode -o /app/build
    
    FROM build AS publish
    ARG Mode=Debug
    RUN echo "$Mode"
    RUN dotnet publish "MetricDemo.csproj" -c $Mode -o /app/publish
    

    我将默认值设置为Debug。现在,这将使我能够在我的 docker-compose.yml 中简单地覆盖它,当它应该被发布时:

    services:
      metricdemo:
        image: metricdemo
        build:
          context: .
          dockerfile: Dockerfile
          args: 
            - Mode=Release
    

    【讨论】:

      【解决方案2】:

      我今天遇到了同样的问题,但是将现有项目迁移到 docker。我的解决方案是从 csproj 中删除 <DebugType>Full</DebugType>。该行是对声纳代码覆盖率的修复,因此它可能会再次破坏它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-27
        • 1970-01-01
        • 2022-01-26
        • 2018-04-07
        • 1970-01-01
        相关资源
        最近更新 更多