Точки останова не достигаются при использовании docker -compose для asp. net основного проекта - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь понять, как отлаживать приложение, когда использую docker. Я нашел эту документацию, которая не дает ожидаемых результатов: https://code.visualstudio.com/docs/containers/docker-compose

Я сделал следующее:

  1. dotnet new mvc
  2. Внутри кода VS 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"]

Оба уровня, build и publi sh, созданы с использованием режима Release. Установка этого параметра в Debug делает свое дело. Теперь возникает вопрос: как я могу управлять этой переменной из docker -compose, чтобы я мог построить режим отладки из docker-compose.debug.yml и конфигурацию выпуска из docker-compose.yml? Я действительно не хочу иметь 2 docker файлов для одного проекта.

1 Ответ

0 голосов
/ 30 мая 2020

Я решил свою проблему, заменив жестко запрограммированную конфигурацию «Release», которая по сравнению с кодом добавляет, на 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

. Я устанавливаю значение по умолчанию Debug. Теперь это позволит мне просто переопределить это в моем docker -compose.yml, когда он должен быть опубликован:

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