在 asp.net core 项目中使用 docker-compose 时未命中断点

Mar*_*rco 4 docker docker-compose visual-studio-code asp.net-core

当我使用 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
Run Code Online (Sandbox Code Playgroud)

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

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

我已经尝试了带和不带debuggerPath套件的两种组合。

之后我使用 docker-compose 启动

docker-compose -f "docker-compose.debug.yml" up --build
Run Code Online (Sandbox Code Playgroud)

然后我附加调试器。

更新调试不起作用的原因实际上是 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"]
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*rco 5

我通过替换硬编码的“Release”配置(vs code 添加的)来解决我的问题ARG

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
Run Code Online (Sandbox Code Playgroud)

我将默认值设置为Debug. 现在,当应该发布它时,我可以在 docker-compose.yml 中简单地覆盖它:

services:
  metricdemo:
    image: metricdemo
    build:
      context: .
      dockerfile: Dockerfile
      args: 
        - Mode=Release
Run Code Online (Sandbox Code Playgroud)