繁体   English   中英

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

[英]Private NuGet feed and docker cache (windows)

我目前正在尝试将 Docker 用于我们的构建过程,以便从任何开发人员机器/服务器轻松重现构建结果。

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

环境是 Windows Containers,.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 restore 下载所有包。

我最初的想法是首先恢复公共 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

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

我正在寻找任何想法,以允许缓存 nuget 还原步骤而不会使 docker 构建失败或在主机上安装 .net sdk。

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

这些是如何在各种 shell 中完成此操作的示例:

Windows CMD 外壳

RUN nuget restore || ver>nul

电源外壳

RUN nuget restore; exit 0

重击

RUN dotnet restore || true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM