【问题标题】:Reading from a private Nuget feed - .NET Core 3.1 Windows Docker Container从私有 Nuget 源读取 - .NET Core 3.1 Windows Docker 容器
【发布时间】:2020-07-11 11:37:35
【问题描述】:

有没有人有使用 Windows 容器在 Azure 中使用 .NET Core 3.1 开发微服务的经验?我遇到了一个问题 我正在尝试从私有 Nuget 提要中读取我的 Dockerfile。这是我的 Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1809 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1809 AS build
WORKDIR /src
COPY ./Nuget.config ./
COPY ["MyService/MyService.csproj", "MyService/"]

ENV NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED true
ENV DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER=0
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS "{\"endpointCredentials\": [{\"endpoint\":\"my_private_feed", \"password\":\"my_personal_access_token\"}]}"

RUN dotnet restore "MyService/MyService.csproj"
COPY . .
WORKDIR "/src/MyService"
RUN dotnet build "MyService.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "MyService.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyService.dll"]

这个 dockerfile 给了我一个 401 Unauthenticated 错误,即使我知道我提供的凭据是正确的。 我也尝试在我的 nuget.config 文件中设置用户和密码,这似乎有效,但我不想拥有 每次令牌过期时进行代码更改以更新密码。 关于如何从这里继续前进的任何建议?我只是没有正确格式化 VSS_NUGET_EXTERNAL_FEED_ENDPOINTS 变量的设置吗?

【问题讨论】:

    标签: azure docker .net-core azure-devops nuget


    【解决方案1】:

    我过去也遇到过同样的问题。我停止使用 VSS_NUGET_EXTERNAL_FEED_ENDPOINTS 并即时创建了 nuget.config

    第一步:创建小助手可执行文件

    namespace DockerBuild
    {
        class Program
        {
            static void Main(string[] args)
            {
                if (args.Count() != 4)
                {
                    Console.WriteLine("Use it: dotnet dockerbuild.dll <username> <pat> <sourceUrl> <target>");
                }
                var user = $"{args[0]}";
                var pat = $"{args[1]}";
                var source = $"{args[2]}";
                var target = $"{args[3]}";
    
                var xml = $"<?xml version=\"1.0\" encoding=\"utf-8\"?><configuration><packageSources><add key=\"YourFeedName\" value=\"{source}\" /></packageSources><packageSourceCredentials><YourFeedName><add key=\"Username\" value=\"{user}\" /><add key=\"ClearTextPassword\" value=\"{pat}\"/></YourFeedName></packageSourceCredentials></configuration>";
                using (var file = new StreamWriter(target))
                {
                    file.WriteLine(xml);
                }
            }
        }
    }
    

    此控制台程序的输出将是:DockerBuild.exe

    第二步:在 docker build 上运行可执行文件

    ENV devops_user=$user
    ENV devops_pat=$pat
    ENV devops_nuget_source=$nuget_source
    RUN DockerBuild.exe %devops_user% %devops_pat% %devops_nuget_source% nuget.config
    

    现在您的文件夹结构中有一个nuget.config 文件,您只需要使用(或复制)它并运行您的dotnet build/publish 命令

    注意:
    这个例子是在一台运行 docker for windows 的 windows 机器上完成的。在 linux 上,必须更改对 DockerBuild.exe 的调用以使用不带 % 的环境变量并使用 linux 等效项。

    【讨论】:

      【解决方案2】:

      您的 docker 镜像可能没有安装 Azure Artifacts NuGet credential provider。它的 repo 自述文件有一个指向 sample dockerfile 的链接,其中包括这一行:

      # download and install latest credential provider. Not required after https://github.com/dotnet/dotnet-docker/issues/878
      RUN wget -qO- https://raw.githubusercontent.com/Microsoft/artifacts-credprovider/master/helpers/installcredprovider.sh | bash
      

      由于您的 dockerfile 使用的是 Windows 基础映像,而不是 Linux,因此您需要对其进行调整,但从概念上讲,这是相同的问题,没有安装凭据提供程序(或者 NuGet 不知道如何找到它) ,因此 NuGet 不知道如何对您的提要进行身份验证。

      编辑:有一个问题询问如何在 Windows docker 映像上安装:https://github.com/microsoft/artifacts-credprovider/issues/169

      【讨论】:

        猜你喜欢
        • 2020-10-10
        • 1970-01-01
        • 2020-07-25
        • 2021-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-11
        相关资源
        最近更新 更多