【问题标题】:How to use dotnet restore properly in Dockerfile如何在 Dockerfile 中正确使用 dotnet restore
【发布时间】:2019-04-26 20:26:58
【问题描述】:

将 docker 支持添加到 ASP.NET Core 项目时,VS (15.9.2) 将添加一个默认的 Dockerfile,用于恢复、构建和发布。但不是只是将所有文件复制到 Docker 构建容器中,它首先仅复制 proj 文件,进行还原,然后在构建之前复制其余部分。我想知道为什么要这样做?这与直接复制所有文件然后进行还原有什么不同?

这种方法的问题是解决方案中的所有 proj 文件都需要单独复制,如果项目非常大并且不时添加和删除项目,那么保持 Dockerfile 同步有点困难有了这个。我只是想知道为什么要这样做,以及是否可以复制所有内容?

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["Temp2/Temp2.csproj", "Temp2/"]
COPY ["Temp3/Temp3.csproj", "Temp3/"]
RUN dotnet restore "Temp2/Temp2.csproj"
COPY . .
WORKDIR "/src/Temp2"
RUN dotnet build "Temp2.csproj" -c Release -o /app

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY . .
RUN dotnet restore "Temp2/Temp2.csproj"
WORKDIR "/src/Temp2"
RUN dotnet build "Temp2.csproj" -c Release -o /app

【问题讨论】:

    标签: asp.net-core dockerfile


    【解决方案1】:

    Docker在构建镜像时,会维护一个build cache

    在构建映像时,Docker 会逐步执行 Dockerfile 中的指令,并按照指定的顺序执行每个指令。在检查每条指令时,Docker 会在其缓存中查找可以重复使用的现有图像,而不是创建新的(重复的)图像。

    重要的是,ADDCOPY 指令得到特殊处理:

    对于ADDCOPY 指令,检查图像中文件的内容并为每个文件计算校验和。这些校验和中不考虑文件的最后修改时间和最后访问时间。在缓存查找期间,将校验和与现有图像中的校验和进行比较。如果文件中有任何更改,例如内容和元数据,则缓存无效。

    在构建 .NET Core 解决方案时,我们可以确定,在运行 dotnet restore 之后,再次运行 dotnet restore 的结果只有在 .csproj 文件发生变化时才会发生变化(例如添加了新包或版本已更改)。

    通过将.csproj文件复制到镜像中单独,我们可以利用Docker的构建缓存,这意味着只要.csproj文件没有改变,@987654332 @step 不会在每次重建映像时都不必要地重新执行。

    【讨论】:

    • 一个例子在这里值得一提
    • @JoePhillips 和其他任何可能关心的人,我写了一个全局工具,当你不想硬编码你所有的 csproj 文件时,我写了一个全局工具来让这更容易。请参阅docs here,进一步详细说明 Kirk 有什么上面提到的。
    • 如果您想要完整的 Dockerfile,请告诉我,我可能会在一个示例项目中添加一个示例项目,以展示它的强大功能。
    猜你喜欢
    • 2019-03-17
    • 2018-11-27
    • 2018-02-04
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多