【问题标题】:Push Docker Image task to ACR fails in Azure "unauthorized: authentication required"将 Docker 映像任务推送到 ACR 在 Azure“未经授权:需要身份验证”中失败
【发布时间】:2019-08-24 23:40:45
【问题描述】:

Azure DevOps 管道中的推送和映像到 Azure 容器注册表任务失败。以前的任务执行得很好,即。 docker 镜像创建成功,登录 ACR 成功。但是,推送任务失败,结果如下:

unauthorized: authentication required
[error]unauthorized: authentication required
[error]/usr/bin/docker failed with return code: 1
[section]Finishing: Push Docker image

docker push 到给定的 acr 从本地命令行可以正常工作。

# Docker image
# Build a Docker image to deploy, run, or push to a container registry.
# Add steps that use Docker Compose, tag images, push to a registry, run an image, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker

trigger:
- master

pool:
  vmImage: 'Ubuntu-16.04'

variables:
  imageName: 'renamed:$(build.buildId)'
  azureSubscriptionEndpoint: Renamed
  azureContainerRegistry: renamed.azurecr.io
steps: 
- task: Docker@1
  displayName: Build docker image
  inputs:
    command: Build an image
    dockerFile: Dockerfile
    imageName: $(imageName)
    containerregistrytype: Azure Container Registry
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureContainerRegistry: $(azureContainerRegistry)
- task: Docker@1
  displayName: Login to container registry
  inputs:
    command: login
    containerregistrytype: Azure Container Registry
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureContainerRegistry: $(azureContainerRegistry)
    dockerFile: Dockerfile
    imageName: $(imageName)
- task: Docker@1
  displayName: Push Docker image
  inputs:
    command: Push an image
    containerregistrytype: Azure Container Registry
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureContainerRegistry: $(azureContainerRegistry)
    imageName: $(imageName)

【问题讨论】:

    标签: azure-devops azure-container-registry


    【解决方案1】:

    我在将 docker 镜像推送到 Azure Container Registry 时遇到了这个问题。

    我得到了错误

    未经授权:需要身份验证,请访问https://aka.ms/acr/authorization了解更多信息。

    这是我修复它的方法

    我的用户已经拥有 Container Registry 的 Owner 角色,因此我有权推送和拉取图像。

    问题在于未在 Azure 容器注册表中启用 admin_user

    我所要做的就是启用管理员用户。这会生成 usernamepasswordpassword2

    接下来,您现在可以使用以下命令登录 Azure Container Registry:

    az acr login --name my-container-registry
    

    标记你的 docker 镜像

    docker tag image-name:image-tag my-container-registry.azurecr.io/image-name:image-tag
    

    现在使用以下命令将映像推送到 Azure 容器注册表:

    docker push my-container-registry.azurecr.io/image-name:image-tag
    

    就是这样

    【讨论】:

    • 向 Azure DevOps 服务连接添加管理员权限似乎可行。做任何这样的事情听起来很愚蠢,但很疯狂。将服务主体用于docker push 根本不适用于Docker@2 任务。
    【解决方案2】:

    在我的例子中,我用 433 标记我的图像。

    例如:<containerRegistryName>.azurecr.io:443/<imageName>

    去掉433后,再次尝试推送,成功!

    【讨论】:

      【解决方案3】:

      转到项目设置 --> 服务连接 --> 编辑 --> 重新验证权限

      应该解决问题

      【讨论】:

        【解决方案4】:

        我在 Azure DevOps 中使用 Azure 容器注册表服务连接时遇到了同样的问题。

        解决方法是在创建 Docker Registry 服务连接时不选择“Azure Container Registry”,而是选择“Others”。然后在 Azure 门户中启用容器注册表上的管理员用户,并使用其中的凭据创建服务连接。

        【讨论】:

        • 这个解决方案对我有用。 (谢谢@Steve!)要添加更多细节,为了启用管理员用户选项,请在门户中打开您的容器注册表,转到“访问密钥”选项卡,然后翻转“管理员用户”切换。用户名(与注册表名称相同)和 2 个密码将出现在切换按钮下方。然后,在 Service Connection 'Others' 表单中,输入用户名作为 Docker ID 并使用 2 个密码之一。对于 Docker Registry,使用 ACR 的登录服务器作为 URL,即https://yourregistry.azurecr.io
        • 这个问题至今仍在发生。甚至尝试赋予服务主体贡献者权利,但没有奏效。感谢您提供此解决方案。
        【解决方案5】:

        从您的构建中删除 docker 登录步骤,docker 任务使用 azure 订阅端点为您处理身份验证(如果配置正确),如果没有 - 将您的服务主体权限授予acrpush)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-16
          • 1970-01-01
          • 1970-01-01
          • 2022-07-29
          相关资源
          最近更新 更多