【问题标题】:Using Docker Buildkit --mount=type=cache for caching Nuget packages for .NET 5 dockerfile使用 Docker Buildkit --mount=type=cache 为 .NET 5 dockerfile 缓存 Nuget 包
【发布时间】:2021-11-26 13:02:26
【问题描述】:

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

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

【问题讨论】:

    标签: docker .net-core dockerfile asp.net5


    【解决方案1】:

    关键是在所有需要访问相同包缓存的 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 .

    【讨论】:

    • 感谢 rob3c 的回复。我还有一个问题,这个缓存是否仅限于此构建运行,或者它可以重复用于此 dockerfile 的每个构建?如果没有,请建议该方法,因为我有很多 nugetpackages 并且每次我通过 docker 文件构建时都会花费大量构建时间。
    • --mount=type=cache,id=nuget,target=/root/.nuget/packages 中的路径假定主机是基于 linux 的。如果主机是 Windows 怎么办?这个功能可以跨平台使用吗?
    • @SKK 缓存用于任何使用相同id 值的构建。它可以使本地构建非常快,但使用新环境的 CI/CD 构建只会在单个 dockerfile 中受益。
    • @MuhammadRehanSaeed 我目前正在使用 linux 容器的 Windows 主机中工作。 target 值是缓存将安装在容器中的位置。 Docker 自己管理它在本地主机上的存储位置,我们无法直接访问。
    • 谢谢@rob3c 我实现了相同的功能,并使用不同的构建运行进行监控,以验证此缓存是否可能不会反映任何新功能。另外,只是想知道,如果我想清除这些缓存,例如我的逻辑中引入了一个新包。在这种情况下,我该如何继续 buildkit 和 mount 将负责新的更改?还是我需要手动清除缓存(在这种情况下,请告诉我如何清除此缓存数据)。
    猜你喜欢
    • 2022-01-07
    • 2020-08-11
    • 2020-01-18
    • 2020-06-12
    • 2020-05-07
    • 2021-05-17
    • 2022-07-15
    • 2021-02-22
    • 1970-01-01
    相关资源
    最近更新 更多