App Service上的容器设置本身看起来很坚固:
但是日志 Pane 显示错误:
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访问权限:存在该设置:
我用该服务主体做了
az login
,然后尝试了az acr login
到注册表。它工作正常。那我在这里想念什么?编辑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 _...变量中传递其凭据,而不是服务主体的凭据。
这令人沮丧,我知道服务主体可以在本地运行时登录并提取,这是一个谜,为什么它不适用于在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
我认为我们需要在这里区分两个部分:
DOCKER_xyz
应用程序设置。我认为DOCKER_xyz
应用程序设置不是为此目的,而是第二部分。 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中读取元数据-仅管理员用户和密码。相关引用资料是:
就个人而言,我建议微软不要使用ACR管理员用户,这令人惊讶,但是他们提供的服务的核心部分即Azure App Service取决于它的启用。让我想知道微软中的不同团队是否知道其他人在做什么或不做什么...
最佳答案
从我得到的谈话信息中,让我解决您对错误的疑惑。
我想您是通过Azure门户将ACR中的镜像部署到Web应用程序的。当您使用Azure门户从ACR部署Web应用程序时,它仅允许您选择ACR,图像和标签,而不能设置凭据。这样,如果启用了管理员用户,Azure将使用管理员用户和密码对其进行设置。如果不启用它,则会发生错误。
并且,如果您要使用服务主体,则建议您使用其他工具,例如Azure CLI。然后,您可以使用 az webapp config container set
命令自己设置Docker注册表凭据。
这是示例,它对我而言效果很好:
使用Azure CLI,可以按照步骤here进行操作。
更新:
这是我这一边的测试屏幕截图:
关于azure - Docker无法从Azure App Service中提取图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60163440/