私有NuGet提要和docker缓存(windows)



我目前正在尝试在构建过程中使用Docker,以便从任何开发人员机器/服务器中轻松复制构建结果。

复杂的是,我有几个软件所依赖的私有包,这需要我在恢复包之前在构建脚本中添加一个变量。这反过来又导致docker不使用nuget恢复步骤的缓存输出。

环境是Windows容器,.Net Framework 4.8代码。

我的(简化的(Dockerfile:

# escape=`
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS dotnetbuild
RUN Invoke-WebRequest https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1 -OutFile installcredprovider.ps1; `
.installcredprovider.ps1 -AddNetfx; `
del installcredprovider.ps1
WORKDIR C:/app
COPY ./*.sln .
COPY ./MyProject/*.csproj /MyProject/packages.config ./MyProject/
COPY ./nuget.config .
ARG PAT
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS "{`"endpointCredentials`": [{`"endpoint`":`"myfeed1.json`", `"username`":`"docker`", `"password`":`"${PAT}`"}, {`"endpoint`":`"myfeed2.json`", `"username`":`"docker`", `"password`":`"${PAT}`"}]}"
RUN nuget restore
COPY . .
RUN msbuild 

理想情况下,我希望防止每次项目构建时都下载所有包。

我最初的想法是首先恢复公共的nuget包(这是大多数(,然后在每次构建时恢复私有包作为权衡:

RUN nuget restore 
COPY ./nuget.config .
ARG PAT
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS "{`"endpointCredentials`": [{`"endpoint`":`"myfeed1.json`", `"username`":`"docker`", `"password`":`"${PAT}`"}, {`"endpoint`":`"myfeed2.json`", `"username`":`"docker`", `"password`":`"${PAT}`"}]}"
RUN nuget restore

然而,第一个nuget命令无法找到所有的包,并给出了一个错误,导致docker构建失败:

Unable to find version '1.0.0.0' of package 'MyPrivatePackage'.
https://api.nuget.org/v3/index.json: Package 'MyPrivatePackage.1.0.0.0' is not found on source 'https://api.nuget.org/v3/index.json'.

我可以在主机上恢复软件包,并将软件包文件夹发送到docker上下文,但我尽量避免在主机上安装除docker之外的任何东西。

目前,我已经实现了一个包含以下内容的批处理文件,并调用它来代替第一个nuget-restore命令:

nuget.exe restore
exit 0

这是有效的,但我觉得这是一个相当肮脏的解决方案。

我正在寻找任何想法,允许在不使docker构建失败或在主机上安装.net sdk的情况下缓存nuget恢复步骤。

对我来说,执行两次nuget restore似乎是最好的方法。正如您所提到的,由于私有提要的还原失败,第一次执行将返回非零退出代码,这将导致Docker构建失败。当您希望退出代码为零时,在各种shell中有一些技术可以补偿非零退出代码。这允许Docker构建继续进行,即使nuget restore命令导致错误。

以下是如何在各种外壳中实现这一点的示例:

Windows CMD外壳

RUN nuget restore || ver>nul

PowerShell

RUN nuget restore; exit 0

Bash

RUN dotnet restore || true

最新更新