Docker - dotnet 恢复无法连接到私有源

Log*_*n K 2 c# docker .net-core

从我的 Dockerfile调用dotnet restore <project>会导致NU1301: Unable to load the service index for source错误。我已经解决了许多建议的类似问题,并且仍然存在问题。以下是我所能提供的有关我尝试过的尽可能多的信息:

  • Docker 引擎的 DNS 设置为“8.8.8.8”
  • 使用Linux容器
  • RUN ping google.com成功(这样我就可以访问互联网)
  • nuget.org击球效果非常好
  • nuget.config 文件当前包含凭据以使其正常工作
    • 一旦我开始工作,这将被删除以采用不同的方法
    • 这些是我在主机上开发期间使用的相同凭据(用户名/PAT)
  • RUN curl <nuget_feed_url>成功
  • 运行恢复命令--verbosity detailed不会提供任何其他错误消息,但会提供一条错误消息

这是有问题的 Dockerfile 部分

FROM mcr.microsoft.com/dotnet/aspnet:6.0.13 AS base
# Create dockeruser in base layer
RUN addgroup --system --gid 1000 dockergroup \
    && adduser --system --uid 1000 --ingroup dockergroup --shell /bin/sh dockeruser

WORKDIR /app
EXPOSE 8080

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
# Arguments are required in each stage in order to get the correct value

WORKDIR /src
COPY ["src/Nucleus.LumberYard.API/", "Nucleus.LumberYard.API/"]
COPY ["./nuget.config", "./nuget.config"]

WORKDIR "/src/Nucleus.LumberYard.API"
#COPY [".editorconfig", "./"]
RUN dotnet restore "Nucleus.LumberYard.API.csproj"
RUN dotnet build "Nucleus.LumberYard.API.csproj" -c Release --no-restore
Run Code Online (Sandbox Code Playgroud)

环境信息

  • Docker 桌面 v3.3.1
  • Docker v20.10.5

Enr*_*one 5

根据我的理解,您有以下情况:

  • 一个 .NET 6 应用程序,其中包含对 nuget 包的一些引用
  • 一些 nuget 包取自通常的 Nuget 公共存储库,其他一些包取自私有 nuget feed
  • 您正在通过 docker 映像分发应用程序,并且在 docker 构建过程中您想要运行针对您的文件dotnet restore之一的命令csproj
  • 命令dotnet restore失败,因为dotnetcli 无法与您的私有 nuget feed 通信

我在做的项目中也遇到了同样的情况。我们有一个托管在 Azure Devops 中的私有 Nuget 源,我们在解决这个问题时也遇到了一些麻烦。

首先,我们先弄清楚问题的根本原因。您做了正确的事情,证明您能够通过curl您提到的命令从构建机器访问 nuget feed。实际上失败的是构建机器和私有 nuget feed 之间的身份验证。

您需要的第一件事是具有 nuget feed读取权限的个人访问令牌。您可以按照本指南创建您需要的个人访问令牌。

获得令牌后,您需要将其提供给dotnetcli。有多种方法可以做到这一点,我将解释对我们有用的一种方法。

我们没有将 nuget 源添加到文件中nuget.config,而是通过 cli 命令注册它。我非常确定有一种方法可以通过文件执行完全相同的操作nuget.config(有关更多详细信息,请参阅此处)。

这是我们在 docker 文件中使用的 cli 命令:

RUN dotnet nuget add source https://foo.bar.com/something/nuget/v3/index.json -u "whatever" -p "my-personal-access-token" --store-password-in-clear-text --valid-authentication-types "basic"
Run Code Online (Sandbox Code Playgroud)

请注意:

  • https://foo.bar.com/something/nuget/v3/index.json是指向您的私有 nuget feed 索引的绝对 URL
  • 用户名可以是任何你喜欢的。您确实需要提供一个值,但我没有注意到任何区别,即使放在那里一个随机字符串就像whatever
  • 虚拟值my-personal-access-token必须替换为您第一步创建的个人访问令牌

您可以在此处找到该命令的完整参考dotnet nuget add source

使用 cli注册此源后dotnet,您将能够dotnet restore正确运行命令。

希望这可以帮助!