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。它实际上意味着什么或做什么?
原因就是层数。在 Dockerfile 中,每个命令都会创建一个新的容器层。为了加速容器的构建,Docker 缓存了这些没有任何变化的层,这意味着命令不必再次运行;简单地使用缓存层。然而,一旦发生变化,Dockerfile 中的每个后续命令都必须再次运行,因为该层以及构建在其上的所有层现在都无效。
存在两条复制行的原因是,提取所有 NuGet 包可能需要一段时间,而发生这种情况唯一需要的是项目文件。这些项目文件不太可能经常更改,因此可以缓存 NuGet 恢复层。如果复制了所有文件,那么对任何文件的任何更改都会使恢复层失效,这意味着它基本上永远不会被缓存。
| 归档时间: |
|
| 查看次数: |
1587 次 |
| 最近记录: |