【问题标题】:Unable to authorize in Azure DevOps (Artifacts) when building a docker image构建 docker 映像时无法在 Azure DevOps (Artifacts) 中授权
【发布时间】:2020-09-02 06:22:37
【问题描述】:

我在 Azure DevOps 中有 Artifacts 并尝试创建 docker build。

  • 平台:Microsoft .NET Core 3.1
  • Docker(本地):19.03.12

我做的步骤:

  1. 在 Azure DevOps 中创建了一个 PAT(具有完全权限)
  2. 使用 Visual Studio 2019 生成 Dockerfile
  3. 在 Dockerfile 中添加:

ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS
"{"endpointCredentials": [{"endpoint":"https://pkgs.dev.azure.com/MYCOMPANY/_packaging/MYPROJECT/nuget/v3/index.json", "用户名":"USER", "密码":"GENERATED_PAT"}]}"

  1. 添加 COPY 命令后:

运行 dotnet restore -s "https://https://pkgs.dev.azure.com/MYCOMPANY/_packaging/MYPROJECT/nuget/v3/index.json" "Project/ProjectName.csproj"

但我在运行时收到“未经授权”错误: docker build 。 -t mydockerfile:v1

/usr/share/dotnet/sdk/3.1.401/NuGet.targets(128,5):错误:无法加载源 https://pkgs.dev.azure.com/MYCOMPANY/_packaging/MYPROJECT/nuget/v3/index.json 的服务索引。 [/src/Project/ProjectName.csproj] /usr/share/dotnet/sdk/3.1.401/NuGet.targets(128,5):错误:响应状态码不表示成功:401(未授权)。 [/src/Project/ProjectName.csproj] 命令 '/bin/sh -c dotnet restore -s "https://pkgs.dev.azure.com/MYCOMPANY/_packaging/MYPROJECT/nuget/v3/index.json" "Project/ProjectName.csproj"' 返回了一个非零码:1

Dockerfile

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80

ENV NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED true
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS \
"{"endpointCredentials": [{"endpoint":"https://pkgs.dev.azure.com/MYCOMPANY/_packaging/MYPROJECT/nuget/v3/index.json", "username":"USER", "password":"GENERATED_PAT"}]}"


FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src

COPY ["MyAPP.Api/MyAPP.Api.csproj", "MyAPP.Api/"]
COPY ["MyAPP.DI/MyAPP.DI.csproj", "MyAPP.DI/"]
COPY ["MyAPP.Application/MyAPP.Application.csproj", "MyAPP.Application/"]
COPY ["MyAPP.Domain/MyAPP.Domain.csproj", "MyAPP.Domain/"]
COPY ["MyAPP.Infrastructure/MyAPP.Infrastructure.csproj", "MyAPP.Infrastructure/"]

RUN dotnet restore -s "https://pkgs.dev.azure.com/MYCOMPANY/_packaging/MYPROJECT/nuget/v3/index.json" "MyAPP.Domain/MyAPP.Domain.csproj"

COPY . .
WORKDIR "/MyAPP.Api"
RUN dotnet build "MyAPP.Api.csproj" -c Release -o /app/build

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

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

【问题讨论】:

  • 这个问题有什么更新吗?如果您没有安装Azure Artifacts Credential Provider endpointCredentials 方式将不起作用。也许您可以使用 nuget.config 方式进行身份验证,请查看我的另一个代码 here。还有这个similar one
  • 嗨,这个问题有更新吗?请检查我下面的回答是否解决了您的问题,如果您被阻止,请随时告诉我。此外,这里的one blog 可以为您提供帮助,它包含一个 dockerfile,其中包含设置 ENV 和安装 Artifact Credential 提供程序的步骤。

标签: azure docker azure-devops


【解决方案1】:

问题的主要原因:

dotnet restore 命令无法实际访问您通过 ENV 设置的凭据。

您可以添加RUN printenv 来打印 ENV 变量。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80

ENV NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED true
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS \
"{"endpointCredentials": [{"endpoint":"https://pkgs.dev.azure.com/MYCOMPANY/_packaging/MYPROJECT/nuget/v3/index.json", "username":"USER", "password":"GENERATED_PAT"}]}"
RUN printenv

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
RUN printenv

查看第一个printenv和第二个printenv命令的日志,可以发现运行dotnet restore的环境无法访问凭证。

解决方案:

您可以在RUN dotnet restore 步骤之前移动/复制define ENV 步骤。

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src

...

ENV NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED true
ENV VSS_NUGET_EXTERNAL_FEED_ENDPOINTS \
"{"endpointCredentials": [{"endpoint":"https://pkgs.dev.azure.com/MYCOMPANY/_packaging/MYPROJECT/nuget/v3/index.json", "username":"USER", "password":"GENERATED_PAT"}]}"

RUN dotnet restore -s "https://pkgs.dev.azure.com/MYCOMPANY/_packaging/MYPROJECT/nuget/v3/index.json" "MyAPP.Domain/MyAPP.Domain.csproj"

【讨论】:

  • @Dimitri 如果设置 ENV,然后在本地运行相同的 dotnet restore 命令,结果会怎样?有用吗?
  • @Dimitri nuget 提要是否存在于您运行管道的同一团队项目中?
  • 不,它们是不同的项目。此外,带有 Artifacts 的项目设置为 public,并且 PAT 是从 Admin 用户生成的
  • "如果你设置了 ENV,然后在本地运行相同的 dotnet restore 命令,结果是什么?它有效吗?"没有得到确切的。如何做到这一点?
  • @Dimitri 我将尝试使用上面的最新信息重现该问题并让您知道。关于 `what ... local, I mean you can [set the ENV](https://github.com/Microsoft/artifacts-credprovider/blob/master/README.md#environment-variables) in local machine, run dotnet restore command` 在 CMD 中手动操作,以便我们知道您的 ENV 步骤是否有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-14
  • 2019-12-24
  • 1970-01-01
  • 2021-03-25
  • 2021-12-24
  • 2021-08-09
  • 2019-03-06
相关资源
最近更新 更多