如何在Dockerfile中正确使用dotnet restore

And*_*ita 2 dockerfile asp.net-core

将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
Run Code Online (Sandbox Code Playgroud)

要么

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
Run Code Online (Sandbox Code Playgroud)

Kir*_*kin 5

Docker构建映像时,会维护一个构建缓存

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

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

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

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

通过将.csproj文件分别复制到映像中,我们可以利用Docker的构建缓存,这意味着只要.csproj文件没有更改,dotnet restore就不会在每次重建映像时不必要地重新执行该步骤。

  • 这里有一个例子是值得的 (6认同)