根据 Microsoft 的说法,默认情况下,调试器以 快速模式 运行,以加快 docker 容器的构建过程。在这种模式下,您的 Dockerfile 只是部分构建。
https://docs.microsoft.com/en-us/visualstudio/containers/container-build?view=vs-2019
在快速模式下,Visual Studio 调用 docker build 时带有一个参数,告诉 Docker 只构建基础阶段。 Visual Studio 处理其余过程,而不考虑 Dockerfile 的内容。因此,当您修改 Dockerfile 时,例如自定义容器环境或安装额外的依赖项,您应该将修改放在第一阶段。放置在 Dockerfile 的构建、发布或最终阶段中的任何自定义步骤都不会执行。
这意味着,如果您在用于运行时的映像之前在 Dockerfile 中引入任何其他映像,它将尝试将此映像用于您的容器。
解决方案
- 如果您希望将所有步骤保留在 Dockerfile 中,同时仍然能够进行调试,请将运行时映像放在文件顶部,并在需要的地方仍然使用它。例如:
FROM mcr.microsoft.com/dotnet/aspnet:3.1 as base
...
FROM base
WORKDIR /src
...
- 或者,您可以将 PropertyGroup 项添加到项目文件中,告诉它以 常规模式 构建 docker 文件。这会减慢您的构建速度。
<PropertyGroup>
<ContainerDevelopmentMode>Regular</ContainerDevelopmentMode>
</PropertyGroup>
重现错误
我通过使用 Docker 支持和容器编排创建一个新的空 .NET 核心项目来验证这一点。
原始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"]