【问题标题】:What's causing authentication error when pushing Docker image to Google Container Registry?将 Docker 映像推送到 Google Container Registry 时导致身份验证错误的原因是什么?
【发布时间】:2023-03-17 15:32:01
【问题描述】:

我正在尝试按照their instructions 将 Docker 映像从 CircleCI 构建推送到 Google Container Registry。但是,由于明显的身份验证错误,推送到 GCR 失败:

Using 'push eu.gcr.io/realtimemusic-147914/realtimemusic-test/realtimemusic-test' for DOCKER_ARGS.
The push refers to a repository [eu.gcr.io/realtimemusic-147914/realtimemusic-test/realtimemusic-test] (len: 1)

Post https://eu.gcr.io/v2/realtimemusic-147914/realtimemusic-test/realtimemusic-test/blobs/uploads/: token auth attempt for registry: https://eu.gcr.io/v2/token?account=oauth2accesstoken&scope=repository%3Arealtimemusic-147914%2Frealtimemusic-test%2Frealtimemusic-test%3Apush%2Cpull&service=eu.gcr.io request failed with status: 403 Forbidden

在推送 Docker 映像之前,我已经针对 Google Cloud 对服务帐户进行了身份验证:

echo $GCLOUD_KEY | base64 --decode > ${HOME}/client-secret.json
gcloud auth activate-service-account --key-file ${HOME}/client-secret.json
gcloud config set project $GCLOUD_PROJECT_ID

然后我构建图像并将其推送到 GCR:

docker build -t $EXTERNAL_REGISTRY_ENDPOINT/realtimemusic-test -f docker/test/Dockerfile .
gcloud docker push -- $EXTERNAL_REGISTRY_ENDPOINT/realtimemusic-test

我在这里做错了什么?

【问题讨论】:

  • 我在日志中看到的另一个问题是“realtime-music-147914”项目似乎不存在。
  • @jsand 呃,是的,我现在看到的项目名称中有一个流氓破折号 :( 不确定我是否一直犯这个错误,现在做另一个构建并纠正该问题。
  • @jsand 我修复了项目名称,错误变成了 403,我想这是有道理的,因为它表示权限错误而不是错误请求。我很确定我昨天看到了 403,所以项目名称中多余的破折号可能是断断续续的。

标签: docker google-kubernetes-engine circleci google-container-registry


【解决方案1】:

您是否尝试过使用 _json_key 方法对 Docker 进行身份验证? https://cloud.google.com/container-registry/docs/advanced-authentication

之后,请使用裸 'docker'(不带 'gcloud')。

【讨论】:

  • 您认为我可能需要授予服务帐户权限才能推送到注册表吗?我只是还没弄清楚如何判断它是否具有正确的权限。
  • 服务帐户需要编辑权限才能创建 GCS 存储桶,这是您的容器注册表所支持的。实际上,您正在做的事情应该没问题。如果您有一个服务帐户作为活动 gcloud 帐户,只要该服务帐户具有编辑权限,“gcloud docker”就应该注入一个有效的访问令牌。
  • 我认为这可能正是问题所在,我没有授予服务帐户编辑权限。我想我最初认为它会给它太多控制权,所以我只给它分配了 Service Account Actor 角色。此外,CircleCI 指南没有说明将哪个角色分配给服务帐户,所以我不确定。
  • 无论如何,我现在再次尝试,已授予服务帐户编辑角色,所以我们会看到。
  • 设置服务帐户using ACLs而不是授予它项目级权限会解决您的问题吗?
【解决方案2】:

如果您使用 google cloud sdk 推送 docker 映像。您可以通过以下命令使用临时授权:

  gcloud docker --authorize-only

上述命令为您提供了使用 docker 推送和拉取图像的临时授权。 您可以参考此链接了解详细信息Gcloud docker。 希望它有助于解决您的问题。

【讨论】:

    【解决方案3】:

    多次重试后...我使用访问令牌解决了:

    gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin https://[HOSTNAME]
    

    【讨论】:

      【解决方案4】:

      服务帐号需要写入包含容器注册表的 Cloud Storage 存储分区的权限。授予服务帐户项目编辑者角色或对存储桶的写入权限(通过 ACL)可以解决问题。后者应该更可取,因为该帐户没有获得比它需要的更广泛的权限。

      【讨论】:

        猜你喜欢
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-09
        • 1970-01-01
        • 2016-07-06
        • 2021-07-26
        • 1970-01-01
        相关资源
        最近更新 更多