ASPNET Core 3.1 - 在 Visual Studio 中运行时 Dockerfile 更改不起作用

Nei*_*ias 1 visual-studio docker dockerfile asp.net-core

我在 Visual Studio 2019(调试模式下的 F5)中运行 Web api(ASPNETCore 3.1 - API),我使用 Docker(用于 Linux),当我更改 Dockerfile 并运行应用程序时,更改不起作用。

示例:我将RUN touch test.txtENV my_variable value放在 Dockerfile 中,但未创建文件和变量。

在此处输入图片说明

有谁知道为什么?

Nei*_*ias 6

没有什么比阅读官方文档更...

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 的构建、发布或最终阶段中的任何自定义步骤都不会执行。

此性能优化仅在您在 Debug 配置中构建时发生。在发布配置中,构建发生在 Dockerfile 中指定的容器中。

我把RUN touch test.txtENV my_variable value放在第一行(Dockerfile 构建基础阶段的地方)并且它可以工作。

一个tip是指RUN touch test.txt,这需要在另一个文件夹中执行(WORKDIR),这个文件夹不同于hostlocal(/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
Run Code Online (Sandbox Code Playgroud)

我的最终 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"]
Run Code Online (Sandbox Code Playgroud)