作者:陈hancox_894 | 来源:互联网 | 2022-11-28 15:16
将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
Kirk Larkin..
5
Docker构建映像时,会维护一个构建缓存:
构建映像时,Docker会逐步执行Dockerfile中的指令,并以指定的顺序执行每个指令。在检查每条指令时,Docker会在其缓存中查找可重用的现有映像,而不是创建新的(重复的)映像。
重要的是,ADD
和COPY
指令得到特殊处理:
对于ADD
和COPY
指令,将检查图像中文件的内容,并为每个文件计算一个校验和。在这些校验和中不考虑文件的最后修改时间和最后访问时间。在高速缓存查找期间,将校验和与现有映像中的校验和进行比较。如果文件中的任何内容(例如内容和元数据)发生了更改,则缓存将无效。
在构建.NET Core解决方案时,我们可以确保在运行之后dotnet restore
,dotnet restore
仅当.csproj
文件已更改(例如,添加了新包或版本)后,再次运行的结果才会更改。
通过将.csproj
文件分别复制到映像中,我们可以利用Docker的构建缓存,这意味着只要.csproj
文件没有更改,dotnet restore
就不会在每次重建映像时不必要地重新执行该步骤。
1> Kirk Larkin..:
Docker构建映像时,会维护一个构建缓存:
构建映像时,Docker会逐步执行Dockerfile中的指令,并以指定的顺序执行每个指令。在检查每条指令时,Docker会在其缓存中查找可重用的现有映像,而不是创建新的(重复的)映像。
重要的是,ADD
和COPY
指令得到特殊处理:
对于ADD
和COPY
指令,将检查图像中文件的内容,并为每个文件计算一个校验和。在这些校验和中不考虑文件的最后修改时间和最后访问时间。在高速缓存查找期间,将校验和与现有映像中的校验和进行比较。如果文件中的任何内容(例如内容和元数据)发生了更改,则缓存将无效。
在构建.NET Core解决方案时,我们可以确保在运行之后dotnet restore
,dotnet restore
仅当.csproj
文件已更改(例如,添加了新包或版本)后,再次运行的结果才会更改。
通过将.csproj
文件分别复制到映像中,我们可以利用Docker的构建缓存,这意味着只要.csproj
文件没有更改,dotnet restore
就不会在每次重建映像时不必要地重新执行该步骤。