App Service上的容器设置本身看起来很坚固:
azure - Docker无法从Azure App Service中提取图像-LMLPHP
但是日志 Pane 显示错误:
azure - Docker无法从Azure App Service中提取图像-LMLPHP

2020-02-11 06:31:40.621 ERROR - Image pull failed: Verify docker image configuration and credentials (if using private repository)
2020-02-11 06:31:41.240 INFO  - Stoping site app505-dfpg-qa2-web-eastus2-gateway-apsvc because it failed during startup.
2020-02-11 06:36:05.546 INFO  - Starting container for site
2020-02-11 06:36:05.551 INFO  - docker run -d -p 9621:8081 --name app505-dfpg-qa2-web-eastus2-gateway-apsvc_0_a9c8277e_msiProxy -e WEBSITE_SITE_NAME=app505-dfpg-qa2-web-eastus2-gateway-apsvc -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=app505-dfpg-qa2-web-eastus2-gateway-apsvc.azurewebsites.net -e WEBSITE_INSTANCE_ID=7d18d5957d129d3dc3a25d7a2c85147ef57f1a6b93910c50eb850417ab59dc56 appsvc/msitokenservice:1904260237

2020-02-11 06:36:05.552 INFO  - Logging is not enabled for this container.
Please use https://aka.ms/linux-diagnostics to enable logging to see container logs here.
2020-02-11 06:36:17.766 INFO  - Pulling image: a...cr/gateway:1.0.20042.2
2020-02-11 06:36:17.922 ERROR - DockerApiException: Docker API responded with status code=NotFound, response={"message":"pull access denied for a...cr/gateway, repository does not exist or may require 'docker login': denied: requested access to the resource is denied"}

2020-02-11 06:36:17.923 ERROR - Pulling docker image a...cr/gateway:1.0.20042.2 failed:
2020-02-11 06:36:17.923 INFO  - Pulling image from Docker hub: a...cr/gateway:1.0.20042.2
2020-02-11 06:36:18.092 ERROR - DockerApiException: Docker API responded with status code=NotFound, response={"message":"pull access denied for a...cr/gateway, repository does not exist or may require 'docker login': denied: requested access to the resource is denied"}

2020-02-11 06:36:18.094 ERROR - Image pull failed: Verify docker image configuration and credentials (if using private repository)
2020-02-11 06:36:19.062 INFO  - Stoping site app505-dfpg-qa2-web-eastus2-gateway-apsvc because it failed during startup.
用于部署App Service的服务主体对容器注册表的父资源组具有AcrPush访问权限:
azure - Docker无法从Azure App Service中提取图像-LMLPHP
存在该设置:
azure - Docker无法从Azure App Service中提取图像-LMLPHP
我用该服务主体做了az login,然后尝试了az acr login到注册表。它工作正常。那我在这里想念什么?
编辑1
我知道凭据是正确的,因为我像这样测试了它们:
azure - Docker无法从Azure App Service中提取图像-LMLPHP
我刚刚从应用程序服务配置中复制值并粘贴在控制台上的位置。 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:
azure - Docker无法从Azure App Service中提取图像-LMLPHP
编辑3
将FQDN用于注册表时,我能够成功提取:
azure - Docker无法从Azure App Service中提取图像-LMLPHP
我更新了管道,但仍然收到相同的错误:
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 _...变量中传递其凭据,而不是服务主体的凭据。
这令人沮丧,我知道服务主体可以在本地运行时登录并提取,这是一个谜,为什么它不适用于在App Service主机上运行的Docker。我们这里还有另一个团队面临同样的问题,他们还没有找到任何解决方案,但是启用了Admin User。
编辑5
整个过程使用专用的服务主体作为Azure DevOps本地发布管道的一部分运行。我称其为Pod Deploy服务主体,或者简称为 SP
DOCKER_xyz表示控制在App Service主机上运行的docker的三个应用程序设置:
  • DOCKER_REGISTRY_SERVER_URL
  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_PASSWORD

  • 我认为我们需要在这里区分两个部分:
  • App Service需要与ACR进行对话,以便从中获取有关图像的详细信息,并在此GUI中显示它们-azure - Docker无法从Azure App Service中提取图像-LMLPHP为了使其正常工作,SP必须在ACR中具有AcrPull角色。否则,GUI会为“图像”和“标签”行显示一个旋转的图标。我以前偶然发现它-How to configure an Azure app service to pull images from an ACR with terraform?现在,对该问题的回答表明,我必须分配AcrPull角色来设置DOCKER_xyz应用程序设置。我认为DOCKER_xyz应用程序设置不是为此目的,而是第二部分。
  • 在我看来,当启动应用服务时,主机使用docker实际从ACR中提取正确的镜像。这部分似乎与(1)无关。为了使其正常工作,应用程序设置必须具有DOCKER_xyz应用程序设置。

  • 我的问题是,第(1)部分效果很好,但即使DOCKER_xyz应用程序设置从第(1)部分中指定了SP的凭据,第(2)部分也不起作用。如果我将DOCKER_xyz指向ACR的管理员用户,那么我可以使其工作的唯一方法。
    但是,为什么在地球上DOCKER_xyz应用程序设置不能指向管道SP(对于部分(1)而言已经足够了)?
    编辑6
    当前的状况是这样。除使用ACR管理员用户和密码外,Azure App Service无法与ACR通信。因此,即使在App Service主机上运行的docker运行时可能知道如何使用任何服务主体登录,App Service也不会使用任何身份或服务主体从ACR中读取元数据-仅管理员用户和密码。相关引用资料是:
  • https://feedback.azure.com/forums/169385-web-apps/suggestions/36145444-web-app-for-containers-acr-access-requires-admin#%7btoggle_previous_statuses%7d
  • https://github.com/MicrosoftDocs/azure-docs/issues/49186

  • 就个人而言,我建议微软不要使用ACR管理员用户,这令人惊讶,但是他们提供的服务的核心部分即Azure App Service取决于它的启用。让我想知道微软中的不同团队是否知道其他人在做什么或不做什么...

    最佳答案

    从我得到的谈话信息中,让我解决您对错误的疑惑。

    我想您是通过Azure门户将ACR中的镜像部署到Web应用程序的。当您使用Azure门户从ACR部署Web应用程序时,它仅允许您选择ACR,图像和标签,而不能设置凭据。这样,如果启用了管理员用户,Azure将使用管理员用户和密码对其进行设置。如果不启用它,则会发生错误。

    并且,如果您要使用服务主体,则建议您使用其他工具,例如Azure CLI。然后,您可以使用 az webapp config container set 命令自己设置Docker注册表凭据。

    这是示例,它对我而言效果很好:

    azure - Docker无法从Azure App Service中提取图像-LMLPHP

    使用Azure CLI,可以按照步骤here进行操作。

    更新:

    这是我这一边的测试屏幕截图:

    azure - Docker无法从Azure App Service中提取图像-LMLPHP

    azure - Docker无法从Azure App Service中提取图像-LMLPHP

    关于azure - Docker无法从Azure App Service中提取图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60163440/

    10-10 18:59