在 Visual Studio 2019 中启动 Docker-compose 时,出现“无法启动调试适配器”的错误?

4

我有一个Visual Studio解决方案,其中我想运行各种API微服务。每个微服务都有其所需的Dockerfiles。我想使用docker-compose运行项目,因此我添加了容器编排支持。我还修改了docker-compose.yml和override文件中的必要内容。然后将docker-compose设置为启动项目。(设置为启动项目)。但是,当我尝试使用F5启动时,调试器不会启动,并出现以下错误消息:

Error message window

发生了一个或多个错误。 无法启动调试适配器。其他信息可能在输出窗口中提供。 操作已取消。
输出窗口:
该程序已以代码-1(0xffffffff)退出。
在Docker桌面上,我可以看到容器,但我的API项目的日志为空。它们无法启动。
(我也启用了虚拟化和HyperV。)
如何解决这个问题?

1
我也遇到了同样的问题。我尝试了几乎所有推荐的方法,但没有成功。 - Chris
1
@Chris,我也是。重新安装了操作系统,重新安装了Docker。结果还是一样。什么都没用。 - TomSoldier
嘿@TomSoldier,你在这里有过什么好运吗?我遇到了同样的问题,并成功获取了更多信息(请参见此处https://stackoverflow.com/questions/69208007/remote-debugger-vsdbg-not-found-and-failed-to-launch-debug-adapter-with-do),但仍然没有解决方案。 - Kevin Versfeld
1个回答

2
根据微软的说法,默认情况下调试器以快速模式运行,以加快构建 Docker 容器的过程。在此模式下,您的 Dockerfile 只会被部分构建。

https://learn.microsoft.com/en-us/visualstudio/containers/container-build?view=vs-2019

在“快速模式”下,Visual Studio 使用一个参数调用 docker build 命令,告诉 Docker 只构建基础阶段。Visual Studio 不考虑 Dockerfile 的内容处理其余的过程。因此,当您修改 Dockerfile 以自定义容器环境或安装其他依赖项时,应将修改放在第一阶段中。任何放置在 Dockerfile 的构建、发布或最终阶段中的自定义步骤都不会被执行。
这意味着,如果您在使用运行时镜像之前在 Dockerfile 中引入了其他镜像,则会尝试使用该镜像来创建您的容器。
解决方案:
1. 如果您想在 Dockerfile 中保留所有步骤,同时仍然能够进行调试,请在文件顶部引入运行时镜像,并在需要时仍然使用它。例如:
FROM mcr.microsoft.com/dotnet/aspnet:3.1 as base 
...
FROM base
WORKDIR /src
...

另外,您可以向项目文件添加 PropertyGroup 项,告诉它在“常规模式”下构建 Docker 文件。这将减慢您的构建速度。
<PropertyGroup>
   <ContainerDevelopmentMode>Regular</ContainerDevelopmentMode>
</PropertyGroup>

重现错误

我通过创建一个带有 Docker 支持和容器编排的新的空 .NET Core 项目来验证这个问题。

原始的 Dockerfile:

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

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

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

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

“正常运行。但是,当在Dockerfile的顶部添加不同的图像(在这种情况下是节点)时,调试器会中断:”
FROM node:14-alpine as node-base

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

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

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

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

谢谢您的回复。我会尝试您的方法,如果有效的话,我会接受它作为解决方案。 - TomSoldier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接