使用 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 restore
、docker build
、 docker publish
).
这是一个简短的 dockerfile 示例,显示了相同的 --mount=type=cache
和相同的 id
分布在单独的 dotnet restore/build/publish
调用中。分离调用并不总是必要的,因为默认情况下 build
将 restore
而 publish
将两者都执行,但这种方式显示跨多个命令共享相同的缓存。缓存挂载声明仅出现在 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 .
目前我正在为 vue+mvc .net 5 混合应用程序创建一个 dockerfile。为此,我需要安装 nodeJS、nuget 包以及安装 webpack。每次我尝试构建图像时,大约需要 30 分钟。我探索了如何减少此构建时间,然后我了解了新的 Docker Buildkit 功能提供的缓存装载。但是,我没有找到很多关于专门使用 nuget 包的示例或文档。
有人可以帮我提供任何已为 nuget 包实现 --mount=type=cache 的示例 dockerfile。
关键是在所有需要访问相同包缓存的 dockerfile RUN
命令中使用相同的 --mount=type=cache
参数(例如 docker restore
、docker build
、 docker publish
).
这是一个简短的 dockerfile 示例,显示了相同的 --mount=type=cache
和相同的 id
分布在单独的 dotnet restore/build/publish
调用中。分离调用并不总是必要的,因为默认情况下 build
将 restore
而 publish
将两者都执行,但这种方式显示跨多个命令共享相同的缓存。缓存挂载声明仅出现在 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 .