没有什么比阅读官方文档...
https://docs.microsoft.com/en-us/visualstudio/containers/container-build?view=vs-2019#debugging
调试
在调试配置中构建时,Visual Studio 会进行多项优化,以帮助提高容器化项目的构建过程的性能。容器化应用程序的构建过程并不像简单地按照 Dockerfile 中列出的步骤那么简单。在容器中构建比在本地机器上构建要慢得多。 因此,当您在 Debug 配置中构建时,Visual Studio 实际上会在本地计算机上构建您的项目,然后使用卷挂载将输出文件夹共享给容器。启用此优化的构建称为快速模式构建。
在快速模式下,Visual Studio 调用 docker build 时带有一个参数,告诉 Docker 只构建基础阶段。 Visual Studio 会处理其余的过程,而不考虑 Dockerfile 的内容。因此,当您修改 Dockerfile 时,例如自定义容器环境或安装额外的依赖项,您应该将您的修改在第一阶段。放置在 Dockerfile 的构建、发布或最终阶段中的任何自定义步骤都不会执行。
此性能优化仅在您构建调试配置时发生。在发布配置中,构建发生在 Dockerfile 中指定的容器中。
我将RUN touch test.txt 和ENV my_variable value 放在第一行(Dockerfile 构建基础阶段的位置),它可以工作。
提示是指RUN touch test.txt,这需要在另一个文件夹中执行(WORKDIR),该文件夹与本地主机(/app)中源代码映射的文件夹不同。
例子:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /tmp
RUN touch teste.txt
WORKDIR /app
ENV my_variable value
EXPOSE 80
EXPOSE 443
我最终的 Dockerfile 是:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /tmp
RUN touch teste.txt
RUN echo "teste1" > teste1.txt
WORKDIR /app
ENV my_variable value
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["MyTestProject/TestProject.csproj", "MyTestProject/"]
RUN dotnet restore "MyTestProject/TestProject.csproj"
COPY . .
WORKDIR "/src/MyTestProject"
RUN dotnet build "TestProject.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "TestProject.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENV my_variable value
RUN touch teste.txt
ENTRYPOINT ["dotnet", "TestProject.dll"]