使用 GitHub Actions,资源上的权限 artifactregistry.repositories.uploadArtifacts 被拒绝。

21

我正在尝试将Docker容器推送到GCP上的Artifact Registry,但在步骤将Docker镜像推送到Artifact Registry时遇到了错误。

被拒绝:权限"artifactregistry.repositories.uploadArtifacts"被拒绝在资源"projects/PROJECT_ID/locations/asia-south1/repositories/images"上(或者它可能不存在)错误:进程以退出代码1完成。

name: Build image and push to Artifact Registry of GCP
on: 
  push:
    branches: 
      - master
 
jobs:
  build-push-artifact:
    name : Build and push Artifact Registry
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - id: 'auth'
      uses: 'google-github-actions/auth@v1'
      with:
        credentials_json: '${{ secrets.ACCOUNT_KEY }}'

    - name: 'Set up Cloud SDK'
      uses: 'google-github-actions/setup-gcloud@v1'

    - name: 'Use gcloud CLI'
      run: 'gcloud info'

    - name: build Docker Image
      run: docker build -t MY_IMAGE:latest .
    
    - name: Configure Docker Client of Gcloud
      run:  |-
        gcloud auth configure-docker --quiet
        gcloud auth configure-docker asia-south1-docker.pkg.dev --quiet
    
    - name: Push Docker Image to Artifact Registry 
      env:
        GIT_TAG: v0.1.0
      run:  |-
        docker tag MY_IMAGE:latest asia-south1-docker.pkg.dev/PROJECT_ID/images/MY_IMAGE:latest
        docker tag MY_IMAGE:latest asia-south1-docker.pkg.dev/PROJECT_ID/images/MY_IMAGE:$GIT_TAG
        docker push asia-south1-docker.pkg.dev/PROJECT_ID/images/MY_IMAGE:latest
        docker push asia-south1-docker.pkg.dev/PROJECT_ID/images/MY_IMAGE:$GIT_TAG

我还将Artifact Registry Write主体添加到具有服务电子邮件的存储库中。除了最后一步之外,其他每一步都成功执行。我该如何修复它?

Nikhil Kumar,这里有两种可能性。第一种是您可能没有提供足够的权限,但在这种情况下并不是真的,所以排除这种可能性。第二种情况是您传递到管道中的详细信息可能不正确,例如在输入项目ID和图像名称时出现了一些人为错误。从管道代码中可以看出,您通过变量传递这些详细信息,因此如果是这种情况,您应该在变量前使用$符号,以便它的值能够反映在管道中。例如:projectid = 1234,您应该在链接中使用$projectid。 - Kranthiveer Dontineni
@KranthiveerDontineni PROJECT_ID,MY_IMAGE和其他内容仅用于演示目的。我也尝试使用硬编码值,但它不起作用。您能否解释一下第一种可能性,我的意思是在这种情况下需要哪些权限。 - Nikhil kumar
1
我尝试使用容器注册表替代工件注册表,通过更改最后一步来实现:docker tag MY_IMAGE:latest gcr.io/PROJECT_ID/MY_IMAGE:latestdocker tag MY_IMAGE:latest gcr.io/PROJECT_ID/MY_IMAGE:$GIT_TAGdocker push gcr.io/PROJECT_ID/MY_IMAGE:latestdocker push gcr.io/PROJECT_ID/MY_IMAGE:$GIT_TAG并且它成功了。 - Nikhil kumar
1
请验证您在图像标记中使用的URL是否正确。这个错误会让人误以为与权限有关,但实际上可能是由于错误的存储库URL引起的。我在使用Cloud Build时遇到了这个错误,但默认权限允许将图像上传到Artifacts Registry。结果发现我在Terraform的"data.google_project"中使用了"id"属性,但这返回的是"projects/PROJECT_ID"而不是"PROJECT_ID",所以我将"$REGION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY_ID"错误地渲染成了"$REGION-docker.pkg.dev/projects/$PROJECT_ID/$REPOSITORY_ID"。希望这可以帮助到您。 - Hector Torres
5个回答

44

好的,我已经花了很多时间在这上面了,现在有两个可能的解决方案:

  • 登录到gcloud:gcloud auth login
  • 配置docker:gcloud auth configure-docker europe-west1-docker.pkg.dev(确保指定适当的区域)

第二种方法对我有效。


2
哇,我简直不敢相信自己竟然没有登录! - Elias Yishak
2
很好的回答。不过我需要使用“europe”区域来推送到Artifact Registry,这让我有点困惑。如果其他人遇到相同问题,错误信息是denied: Permission "artifactregistry.repositories.uploadArtifacts" denied on resource "projects/<PROJECT ID>/locations/europe/repositories/eu.gcr.io"。我通过以下方式解决了问题:gcloud auth configure-docker europe-docker.pkg.dev - Graunephar
请注意,此信息已记录在https://cloud.google.com/artifact-registry/docs/docker/pushing-and-pulling#auth。 - william_grisaitis
抱歉,但在上述文件中哪里提到您应该或必须使用“欧洲”区域的问题?'欧洲'只是个例子。 - kwick
另一个建议:将gcloud/bin/docker-credential-gcloud添加到您的系统路径中。否则会出现权限被拒绝的错误。 - undefined
显示剩余2条评论

5
终于这对我起作用了。我在Artifact注册表上也遇到了上述问题。
所以在执行docker push之前,我进行了身份验证。虽然文档中没有明确提到这一步骤,但这对我起作用了。
gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin https://us-central1-docker.pkg.dev

请注意:更改您的地区。

2
如果上述罗曼提供的解决方案未能解决问题,您应该检查分配给尝试将图像推送到注册表的用户的角色。
IAM策略故障排除工具可以帮助解决此问题,例如,您可以将您的用户电子邮件作为主体、要访问的资源(在这种情况下是注册表)以及所期望的权限(在本例中是'uploadArtifacts')提供给它。

enter image description here


0
另一个错误场景和我如何修复这个错误:
如果你是通过snap(在Ubuntu上)安装的docker,那么这个版本的docker会在不同的路径寻找配置文件,并且不会使用gcloud auth configure-docker...步骤更新的docker配置文件~/.docker/config.json
在我的情况下,我卸载了snap版本,并通过Docker网站上提供的辅助脚本重新安装了docker。或者你可以将更新后的配置文件复制到snap docker安装的位置。

0
错误提示表示以下情况之一:
  • 主体(GitHub Actions 服务帐户)没有足够的权限(即roles/artifactregistry.writer
  • 或者 GHA 没有登录到 Docker
为了确保 GHA 已登录到 Google Artifact Registry,您可以使用支持工作负载身份联合认证的 docker/login-action@v3
name: ci

on:
  push:
    branches: main

jobs:
  login:
    runs-on: ubuntu-latest
    steps:
      -
        name: Authenticate to Google Cloud
        id: auth
        uses: google-github-actions/auth@v1
        with:
          token_format: access_token
          workload_identity_provider: <workload_identity_provider>
          service_account: <service_account>
      -
        name: Login to GAR
        uses: docker/login-action@v3
        with:
          registry: <location>-docker.pkg.dev
          username: oauth2accesstoken
          password: ${{ steps.auth.outputs.access_token }}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接