根据微软的说法,默认情况下调试器以快速模式运行,以加快构建 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"]