使用 Docker Buildkit --mount=type=cache 为 .NET 5 dockerfile 缓存 Nuget 包

Using Docker Buildkit --mount=type=cache for caching Nuget packages for .NET 5 dockerfile

目前我正在为 vue+mvc .net 5 混合应用程序创建一个 dockerfile。为此,我需要安装 nodeJS、nuget 包以及安装 webpack。每次我尝试构建图像时,大约需要 30 分钟。我探索了如何减少此构建时间,然后我了解了新的 Docker Buildkit 功能提供的缓存装载。但是,我没有找到很多关于专门使用 nuget 包的示例或文档。

有人可以帮我提供任何已为 nuget 包实现 --mount=type=cache 的示例 dockerfile。

关键是在所有需要访问相同包缓存的 dockerfile RUN 命令中使用相同的 --mount=type=cache 参数(例如 docker restoredocker builddocker publish).

这是一个简短的 dockerfile 示例,显示了相同的 --mount=type=cache 和相同的 id 分布在单独的 dotnet restore/build/publish 调用中。分离调用并不总是必要的,因为默认情况下 buildrestorepublish 将两者都执行,但这种方式显示跨多个命令共享相同的缓存。缓存挂载声明仅出现在 dockerfile 本身中,不需要 docker build.

中的参数

该示例还展示了如何使用 BuildKit --mount=type=secret 参数传入一个 NuGet.Config 文件,该文件可能被配置为访问例如私人 nuget 提要。默认情况下,以这种方式传递的秘密文件出现在 /run/secrets/<secret-id> 中,但您可以通过 docker build 命令中的 target 属性更改它们的位置。它们仅在 RUN 调用期间存在,不会保留在最终图像中。

# syntax=docker/dockerfile:1.2
FROM my-dotnet-sdk-image as builder
WORKDIR "/src"
COPY "path/to/project/src" .

RUN --mount=type=cache,id=nuget,target=/root/.nuget/packages \
    --mount=type=secret,id=nugetconfig \
    dotnet restore "MyProject.csproj" \
    --configfile /run/secrets/nugetconfig \
    --runtime linux-x64

RUN --mount=type=cache,id=nuget,target=/root/.nuget/packages \
    dotnet build "MyProject.csproj" \
    --no-restore \
    --configuration Release \
    --framework netcoreapp3.1 \
    --runtime linux-x64

RUN --mount=type=cache,id=nuget,target=/root/.nuget/packages \
    dotnet publish "MyProject.csproj" \
    --no-restore \
    --no-build \
    -p:PublishReadyToRun=true \
    -p:PublishReadyToRunShowWarnings=true \
    -p:TieredCompilation=false \
    -p:TieredCompilationQuickJit=false \
    --configuration Release \
    --framework netcoreapp3.1 \
    --runtime linux-x64

为私人提要传入 nugetconfig 文件的示例 docker build 命令可能是:

docker build --secret id=nugetconfig,src=path/to/nuget.config -t my-dotnet-image .

对于该命令,需要设置环境变量DOCKER_BUILDKIT=1

或者,您可以使用 buildx:

docker buildx build --secret id=nugetconfig,src=path/to/nuget.config -t my-dotnet-image .