【问题标题】:ASPNET Core 3.1 - Dockerfile changes don´t work when run in Visual StudioASPNET Core 3.1 - Dockerfile 更改在 Visual Studio 中运行时不起作用
【发布时间】:2020-03-31 00:16:59
【问题描述】:

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

示例: 我把RUN touch test.txtENV my_variable value放到Dockerfile里面,但是文件和变量都没有创建。

有人知道为什么吗?

【问题讨论】:

  • 仅使用 docker 的 CLI 工具在 Visual Studio 外部创建容器时,这是否有效?
  • 是的,它有效,只是在 Visual Studio (F5) 中运行时无效。

标签: visual-studio docker asp.net-core dockerfile


【解决方案1】:

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

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.txtENV 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"]

【讨论】:

    【解决方案2】:

    您可以通过在 .csproj 文件的属性组内添加以下标记 DockerfileRunEnvironmentFiles 来选择包含要传递给 docker run 命令的其他环境文件:

    <PropertyGroup>
       <DockerfileRunEnvironmentFiles>your_env_file.env</DockerfileRunEnvironmentFiles>
       ... 
       ...
    <PropertyGroup>
    

    your_env_file.env:

    PAT=[Personal Access Token]
    PROJECT=[Azure DevOps Project URL]
    VARIABLE=[Filename of the variable file including extension]
    WORKSPACE=[Name of the default workspace]
    

    对于参数未传递的问题,您可以将其添加到您的 csproj:

    <PropertyGroup>
       <DockerDebuggeeArguments>touch test.txt</DockerDebuggeeArguments>
       ...
       ...
    </PropertyGroup>
    
    

    在这里找到:https://docs.microsoft.com/en-us/visualstudio/containers/container-msbuild-properties?view=vs-2019

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 2018-12-08
      • 2019-11-18
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2017-10-03
      相关资源
      最近更新 更多