Docker无法从Azure应用程序服务中提取图像

Docker无法从Azure应用程序服务中提取图像,azure,docker,azure-web-app-service,Azure,Docker,Azure Web App Service,应用程序服务it self上的容器设置看起来很可靠: 但日志窗格显示错误: 用于部署应用程序服务的服务主体具有对容器注册表的父资源组的推送访问权限: 设置如下所示: 我对该服务负责人进行了az登录,然后尝试az acr登录。它很好用。那么我在这里错过了什么 编辑1 我知道凭据是正确的,因为我对它们进行了如下测试: 我刚刚从应用程序服务配置中复制了这些值并粘贴到控制台上。docker登录没有问题 一定是别的原因 编辑2 然而,我也明白了这一点: C:\Dayforce\fintech [

应用程序服务it self上的容器设置看起来很可靠:

但日志窗格显示错误:

用于部署应用程序服务的服务主体具有对容器注册表的父资源组的推送访问权限:

设置如下所示:

我对该服务负责人进行了
az登录
,然后尝试
az acr登录
。它很好用。那么我在这里错过了什么

编辑1

我知道凭据是正确的,因为我对它们进行了如下测试:

我刚刚从应用程序服务配置中复制了这些值并粘贴到控制台上。docker登录没有问题

一定是别的原因

编辑2

然而,我也明白了这一点:

C:\Dayforce\fintech [shelve/terraform ≡]> docker pull a...r/gateway
Using default tag: latest
Error response from daemon: pull access denied for a...r/gateway, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
所以,我可以登录,但不能拉。非常奇怪,因为帐户配置为具有对容器的
AcrPush
访问权限,其中包括
AcrPull

编辑3

使用注册表的FQDN时,我能够成功拉取:

我更新了管道,但仍然收到相同的错误:

2020-02-11 16:03:50.227 ERROR - Pulling docker image a...r.azurecr.io/gateway:1.0.20042.2 failed:
2020-02-11 16:03:50.228 INFO  - Pulling image from Docker hub: a...r.azurecr.io/gateway:1.0.20042.2
2020-02-11 16:03:50.266 ERROR - DockerApiException: Docker API responded with status code=InternalServerError, response={"message":"Get https://a...r.azurecr.io/v2/gateway/manifests/1.0.20042.2: unauthorized: authentication required"}

2020-02-11 16:03:50.269 ERROR - Image pull failed: Verify docker image configuration and credentials (if using private repository)
2020-02-11 16:03:50.853 INFO  - Stoping site app505-dfpg-qa2-web-eastus2-gateway-apsvc because it failed during startup.
编辑4

我发现唯一有效的方法是在ACR上启用管理员用户,并在DOCKER\ux中传递其凭据。。。变量,而不是服务主体的凭据

这是令人沮丧的,我知道服务主体可以在本地运行时登录和拉取,这是一个谜,为什么它不适用于在应用程序服务主机上运行的docker。我们这里有另一个团队面临同样的问题,他们没有找到任何解决方案,但启用了管理员用户

编辑5

整个过程作为Azure DevOps on prem发布管道的一部分运行,使用专用的服务主体。让我称之为Pod部署服务主体,或者简称为SP

DOCKER_xyz
表示控制应用程序服务主机上运行的DOCKER的三个应用程序设置:

  • DOCKER\u注册表\u服务器\u URL
  • DOCKER\u注册表\u服务器\u用户名
  • DOCKER\u注册表\u服务器\u密码
我认为我们需要区分两个部分:

  • 应用程序服务需要与ACR对话,以便从中提取有关图像的详细信息,并将其显示在此GUI中-要使其工作,SP必须在ACR中具有AcrPull角色。否则,GUI会为图像和标记行显示旋转图标。我以前偶然发现过它-现在这个问题的答案表明我必须分配AcrPull角色并设置
    DOCKER_xyz
    应用程序设置。我认为DOCKER_xyz应用程序设置不是为了这个,而是为了第二部分
  • 在我看来,当应用程序服务启动时,主机使用docker从ACR中实际提取正确的图像。这一部分似乎与第(1)部分分离。要使其工作,应用程序设置必须具有
    DOCKER\u xyz
    app设置
  • 我的问题是第(1)部分工作得很好,但第(2)部分即使
    DOCKER_xyz
    app settings指定了第(1)部分中SP的凭据,也没有这样做。如果我将
    DOCKER_xyz
    指向ACR的管理员用户,我就可以让它工作

    但这就是为什么
    DOCKER_xyz
    应用程序设置无法指向管道SP的原因,该SP对于第(1)部分来说已经足够好了

    编辑6

    目前的情况是这样的。Azure应用程序服务无法与ACR通信,除非使用ACR管理员用户和密码。因此,即使运行在应用服务主机上的docker运行时可能知道如何使用任何服务主体登录,应用服务也不会使用任何标识或服务主体从仅ACR的管理员用户和密码读取元数据。有关参考资料如下:


    就我个人而言,微软建议不要使用ACR管理员用户,这让我感到惊讶,但他们提供的一个非常核心的部分,即Azure应用程序服务,取决于它的启用。让我想知道微软的不同团队是否知道其他人在做什么或没有做什么…

    从我从演讲中得到的信息中,让我来解答您关于错误的疑问

    我猜您是通过Azure门户将ACR中的映像部署到Web应用程序的。当您使用Azure门户从ACR部署Web应用程序时,它只允许您选择ACR、图像和标记,但不允许您设置凭据。通过这种方式,如果启用管理员用户,Azure将使用管理员用户和密码自行设置。如果不启用它,就会发生错误

    如果您想使用服务主体,我建议您使用其他工具,例如Azure CLI。然后,您可以使用命令自己设置docker注册表凭据

    下面是一个例子,在我这方面效果很好:

    使用Azure CLI,您可以按照以下步骤操作

    更新:

    以下是我这边的测试截图:


    为了让快速阅读者更容易理解mark的惊人工作:为了让一切正常工作,当然还必须启用管理员用户(默认情况下,管理员用户是禁用的)。例如,通过发布:

    az acr update -n <your-azureregistry-name> --admin-enabled true
    
    az acr update-n--管理员启用为true
    

    在控制台上。

    经过大量研究,我找到了一种方法来解决这个问题,而无需启用管理员用户

  • 使用Azure Active Directory创建应用程序注册并将秘密存储在某处
  • 转到Azure容器注册表,将角色分配添加到此新创建的应用程序,权限为AcrPush(其中还包含AcrPull)
  • 在应用程序服务配置中,替换变量
  • 这将解决Docker Api异常

    令人困惑的是,这不是曼蒂奥
    az acr update -n <your-azureregistry-name> --admin-enabled true
    
    DOCKER_REGISTRY_SERVER_PASSWORD with Client Secret of app registration which was saved in the first step
    DOCKER_REGISTRY_SERVER_USERNAME with client Id of App registration