为什么我们在Asp.net core的DockerFile中需要多个复制指令

Sad*_*han 2 docker asp.net-core

目前我正在学习docker。我正在阅读官方文档来为 ASP.NET Core 创建 Docker 映像,该映像显示了包含以下内容的 DockerFile

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
Run Code Online (Sandbox Code Playgroud)

我最终成功创建了镜像和容器。

这里,在 DockerFile 中我们有两个 COPY 指令。

第一个,仅复制该目录中的 *.csproj 文件并将其粘贴到 docker 映像内的 /app 目录。

第二个,复制所有其他文件并将其粘贴到 docker 映像内的 /app 目录。

据了解,这两个COPY指令在做同样的事情。因此,我们可以编写一个,而不是两个不同的复制指令,并且它可以正常工作。像这样 -

COPY . ./
RUN dotnet restore
RUN dotnet publish -c Release -o out
Run Code Online (Sandbox Code Playgroud)

那么,为什么我们使用两条不同的指令将文件复制到 docker 镜像呢?它在两个复制指令中表现良好吗?

在第一COPY条指令中,有一条注释#Copy csproj and restore as distinct layers。它实际上意味着什么或做什么?

Chr*_*att 5

原因就是层数。在 Dockerfile 中,每个命令都会创建一个新的容器层。为了加速容器的构建,Docker 缓存了这些没有任何变化的层,这意味着命令不必再次运行;简单地使用缓存层。然而,一旦发生变化,Dockerfile 中的每个后续命令都必须再次运行,因为该层以及构建在其上的所有层现在都无效。

存在两条复制行的原因是,提取所有 NuGet 包可能需要一段时间,而发生这种情况唯一需要的是项目文件。这些项目文件不太可能经常更改,因此可以缓存 NuGet 恢复层。如果复制了所有文件,那么对任何文件的任何更改都会使恢复层失效,这意味着它基本上永远不会被缓存。