Docker 从github操作访问gcloud中的服务帐户时出现问题

Docker 从github操作访问gcloud中的服务帐户时出现问题,docker,gcloud,github-actions,Docker,Gcloud,Github Actions,我对github actions和gcloud还很陌生。我很难让我的github CI/CD管道运行,因为由于访问限制,我无法将任何docker映像推送到google云注册表 到目前为止,我做了什么: 我在github上托管了一个Quarkus应用程序 我使用github操作构建Maven项目和docker映像 我在google Cloud中创建了一个项目,并添加了一个用于github操作的服务帐户。登录似乎可以工作: 如果我现在尝试推送docker映像,我会收到以下(预期)错误消息:

我对github actions和gcloud还很陌生。我很难让我的github CI/CD管道运行,因为由于访问限制,我无法将任何docker映像推送到google云注册表

到目前为止,我做了什么:

  • 我在github上托管了一个Quarkus应用程序
  • 我使用github操作构建Maven项目和docker映像
  • 我在google Cloud中创建了一个项目,并添加了一个用于github操作的服务帐户。登录似乎可以工作:
  • 如果我现在尝试推送docker映像,我会收到以下(预期)错误消息:
  • 接下来,我打开谷歌云控制台,创建了一个具有必要权限的自定义角色(IAM&Admin->Roles->Create role)

  • 然后,我很难将新的自定义角色分配给服务帐户(IAM&Admin->service Accounts->Manage Access->Add member)。我将服务帐户的电子邮件地址用作“新成员”,但我无法选择刚刚创建的自定义角色我错过了什么?

  • 我在某个地方读到,我也可以作为成员添加服务帐户(IAM&Admin->IAM->add)。我再次使用服务帐户的电子邮件地址作为“新成员”。这次我可以选择我的自定义角色第一种方法有什么区别?

  • 无论如何,如果我再次尝试运行github操作,现在会出现以下错误:

错误消息是不同的,所以我猜服务帐户的权限在某种程度上起了作用,但仍然无法成功我错过了哪些步骤?


非常感谢您的帮助。非常感谢

调试此操作的一种方法是在本地主机上为服务帐户创建密钥,将脚本|
gcloud
配置为使用服务帐户作为其凭据,然后手动尝试推送

一个直接的问题可能是您没有针对Google容器注册中心(GCR)进行身份验证。GCR实现Docker的注册表API,在与注册表交互之前,您需要使用其中一种机制来

注:

  • 我认为您不需要创建自定义角色。你有两个选择。或者(首选)专门为CI/CD作业创建一个帐户,并向其授予所需的最少角色集,包括
    storage.bucket.get
    。我认为您可以从
    角色/storage.admin
    ()开始,也许以后可以进行优化
  • 您可以向项目授予角色,例如
    角色/storage.admin
    ,在这种情况下,权限适用于所有云存储资源,或者向特定的Bucket授予权限,在这种情况下,权限仅适用于Bucket及其对象
  • 服务账户在GCP中具有双重角色。作为身份和资源(可由其他身份使用)。这可能令人困惑

  • 非常感谢你的想法,我将尝试一下并报告结果。
    Run google-github-actions/setup-gcloud@master
    /usr/bin/tar xz --warning=no-unknown-keyword -C /home/runner/work/_temp/ac85f67a-89fa-4eb4-8d30-3f6379124ec2 -f /home/runner/work/_temp/de491940-a4b1-4a15-bf0a-95d563e68362
    /opt/hostedtoolcache/gcloud/342.0.0/x64/bin/gcloud --quiet config set project ***
    Updated property [core/project].
    Successfully set default project
    /opt/hostedtoolcache/gcloud/342.0.0/x64/bin/gcloud --quiet auth activate-service-account github-actions@***.iam.gserviceaccount.com --key-file -
    Activated service account credentials for: [github-actions@***.iam.gserviceaccount.com]
    
    Run docker push "$GCR_HOSTNAME/$PROJECT_ID/$IMAGE:$IMAGE_TAG"
    The push refers to repository [eu.gcr.io/***/***]
    715ac1ae8693: Preparing
    435cfe5f5775: Preparing
    313d03d71d4d: Preparing
    c5c8d86ccee1: Preparing
    1b0f2238925b: Preparing
    144a43b910e8: Preparing
    4a2bc86056a8: Preparing
    144a43b910e8: Waiting
    4a2bc86056a8: Waiting
    denied: Token exchange failed for project '***'. Caller does not have permission 'storage.buckets.get'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control
    Error: Process completed with exit code 1.
    
    Run docker push "$GCR_HOSTNAME/$PROJECT_ID/$IMAGE:$IMAGE_TAG"
    The push refers to repository [eu.gcr.io/***/***]
    c4f14c9d3b6e: Preparing
    fe78d438e8e2: Preparing
    843fcae4a8f4: Preparing
    dcf8cc80cedb: Preparing
    45e8815b101d: Preparing
    144a43b910e8: Preparing
    4a2bc86056a8: Preparing
    144a43b910e8: Waiting
    4a2bc86056a8: Waiting
    denied: Access denied.
    Error: Process completed with exit code 1.