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