Docker无法从Azure应用服务中提取映像

mm5n2pyu  于 2023-01-29  发布在  Docker
关注(0)|答案(8)|浏览(146)

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

但日志窗格显示错误:

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.

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

设置存在:

我用那个服务主体做了az login,然后尝试az acr login到注册表。它工作得很好。那么我错过了什么呢?

    • 编辑1**

我知道凭据是正确的,因为我是这样测试的:

在那里我刚刚从应用服务配置中复制了值并粘贴到console. 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上启用Admin User,并在DOCKER_...变量中传递其凭据,而不是服务主体的凭据。
这是令人沮丧的,我知道服务主体可以登录和拉时,本地运行,这是一个谜,为什么它不工作的docker上运行的应用程序服务主机。我们有另一个团队在这里面临同样的问题,他们没有找到任何解决方案,但启用管理员用户。

    • 编辑5**

整个流程作为Azure DevOps内部部署发布管道的一部分使用专用服务主体运行。我将其称为Pod Deploy服务主体或简称为SP
DOCKER_xyz表示控制在应用服务主机上运行的Docker的三个应用设置:

  • DOCKER_REGISTRY_SERVER_URL
  • DOCKER_REGISTRY_SERVER_USERNAME
  • DOCKER_REGISTRY_SERVER_PASSWORD

我认为我们需要区分两个部分:
1.应用程序服务需要与ACR通信,以便从中提取有关图像的详细信息,并将其显示在此GUI-

中。要使其正常工作,SP必须在ACR中具有AcrPull角色。如果不这样做,将导致GUI显示Image和Tag行的旋转图标。我以前偶然发现过它-How to configure an Azure app service to pull images from an ACR with terraform?现在这个问题的答案表明,我必须分配AcrPull角色设置DOCKER_xyz应用设置。我认为DOCKER_xyz应用设置不是为了这个,而是为了第二部分。
1.在我看来,当一个应用程序服务启动时,主机使用Docker从ACR中实际拉取正确的图像。这部分似乎与(1)分离。要使其工作,应用程序设置必须具有DOCKER_xyz应用程序设置。
我的问题是,部分(1)工作得很好,但部分(2)没有,即使DOCKER_xyz应用程序设置指定了部分(1)的SP凭据。唯一的方法是我可以使它工作,如果我指向ACR的管理员用户DOCKER_xyz
但是,这到底是为什么DOCKER_xyz应用程序设置不能指向管道SP,这是足够好的部分(1)?

    • 编辑6**

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

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

hzbexzde

hzbexzde1#

为我执行这些步骤后,应用服务开始拉取。:D
1.在Azure容器注册表中启用管理员访问权限
1.在应用程序服务配置中,提供容器注册表管理员凭据DOCKER_REGISTRY_SERVER_PASSWORD(启用管理员的密码)、DOCKER_REGISTRY_SERVER_USERNAME(crxxxxxx)、DOCKER_REGISTRY_SERVER_URL(https://crxxxxxx.azurecr.io
1.转到您的应用程序服务并选择左侧的身份部分,然后单击系统分配-将状态更改为打开。
1.现在转到IAM Control容器注册表,将ACR拉取角色添加到在步骤3中启用的App Service系统分配的标识。
1.重新启动你的应用服务并等待。更改将需要几分钟才能反映出来,因此请刷新日志。(10分钟或更长时间)
祝你好运:)

y53ybaqx

y53ybaqx2#

经过大量研究,我找到了一种方法解决此问题,而无需启用管理员用户
1.使用Azure Active Directory创建应用注册并将机密存储在某个位置。
1.转到Azure容器注册表,并使用AcrPush权限(其中还包含AcrPull)向此新创建的应用添加角色分配。

1.在应用程序服务配置中,替换变量。

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

这将解决Docker API异常。
令人困惑的是,这在任何Azure容器注册表文档中都没有提到,尽管我认为在AAD文档中间接提到过。😐.

qvtsj1bj

qvtsj1bj3#

根据我从谈话中得到的信息,让我来解答你关于这个错误的困惑。
我猜你是通过Azure门户将ACR中的映像部署到Web应用程序的。当你使用Azure门户从ACR部署Web应用程序时,它只允许你选择ACR和映像以及标记,但不允许你设置凭据。这样,如果你启用管理员用户,Azure将使用管理员用户和密码自行设置。如果你不启用它,就会发生你得到的错误。
如果你想使用服务主体,我建议你使用其他工具,比如Azure CLI,然后你可以用命令az webapp config container set自己设置docker注册表凭据。
下面是一个例子,它在我这边工作得很好:

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

    • 更新日期:**

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

rpppsulh

rpppsulh4#

通过将“acrUseManagedIdentityCreds”设置为True找到了答案。此注解中的第二个命令:https://stackoverflow.com/a/69120462/17430834
编辑1:添加命令
以下是您需要运行的命令以进行此更改。

az resource update --ids /subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.Web/sites/<app-name>/config/web --set properties.acrUseManagedIdentityCreds=True
zzwlnbp8

zzwlnbp85#

我尝试在Azure DevOps管道中执行相同操作,但遇到了同样的问题。我不知道如何使用ACR名称使其工作,但如果您改用您的_ www.example.com,它会工作acr_name.azurecr.io。如果您转到ACR的“访问键”页面,您将找到两个值"注册表名称“:MyCoolRegistry(不工作,如果你使用这个)登录服务器:mycoolregistry.azurecr.io登录服务器正在工作-只需将其作为containerRegistry放入您的管道中,而无需创建服务连接。
以防有人纠结于此。

oxalkeyp

oxalkeyp6#

只是为了补充马克的惊人工作,通过和快速的读者:要使一切正常工作,当然还必须启用管理员用户(默认情况下是禁用的)。2例如,通过发出:

az acr update -n <your-azureregistry-name> --admin-enabled true

在控制台上。

bhmjp9jg

bhmjp9jg7#

我在尝试将Docker应用程序部署到Azure Web Apps for container时遇到了同样的问题。
当我部署应用程序时,我会得到错误:
对接器Api异常:Docker API响应,状态代码=NotFound,响应={“message”:“拒绝对.. my-repo/image的拉入访问,存储库不存在或可能需要”Docker登录“:拒绝:请求的资源访问被拒绝”}。

我是这么解决的

问题是我没有指定映像的完整路径,我应该在docker image-name中包含my-registry-url,也就是说,我应该使用my-registry-url/image-name,而不仅仅是image-name,因为我试图从一个私有存储库中提取。
假设这些是变量:

  • Docker映像名称为promiseapp
  • 停靠站注册表URL为promisecicdregistry.azurecr.io
  • 资源组为dockerprojects
  • 应用服务计划为dockerlinuxprojects
  • azure Web应用程序名称为promiseapptest
  • 停靠注册表用户为test-user
  • docker注册表密码为12345678

那我的命令是

az webapp create --resource-group dockerprojects --plan dockerlinuxprojects --name promiseapptest --deployment-container-image-name promisecicdregistry.azurecr.io/promiseapp

az webapp config container set --resource-group dockerprojects --name promiseapptest --docker-custom-image-name promisecicdregistry.azurecr.io/promiseapp --docker-registry-server-url https://promisecicdregistry.azurecr.io --docker-registry-server-user test-user --docker-registry-server-password 12345678
utugiqy6

utugiqy68#

在我的示例中,我通过使用完全限定的Azure容器注册表名称修复了错误,如下所示:

xwezi.azurecr.io

以前的值为

xwezi

当我手动部署到应用服务时,我不会收到该错误。但是,当我使用Azure应用服务部署任务将容器部署到应用服务时,该服务将无法正常工作。并且,日志流将显示上述错误。
不幸的是,错误信息对我发现这一点没有帮助。但我希望这将保存您的时间:)

相关问题