我有一个GCP项目。在这里,我在运行Teamcity容器的情况下使用GKE。这个Teamcity容器是我的构建服务器,也是我运行构建步骤/脚本的位置。
其中一个构建步骤希望将docker映像推送到Google Container Registry。这样做会导致此错误:
denied: Token exchange failed for project 'coopr-mod'. Caller does not have permission 'storage.buckets.create'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control
我阅读了上面提到的说明链接,但无法找到解决问题的方法。
为了完成,我在此写下执行的构建步骤:
步骤1:
# Create environment variable for correct distribution
export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
# Add the Cloud SDK distribution URI as a package source
echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
# Import the Google Cloud Platform public key
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
# Update the package list and install the Cloud SDK
sudo apt-get -y update && sudo apt-get -y install google-cloud-sdk
步骤2:
gcloud --quiet auth configure-docker
步骤3:`docker build myimage:1
步骤4:docker tag myimage:1 eu.gcr.io/my-project/myimage:1
步骤5 :(失败的步骤)docker push eu.gcr.io/coopr-mod/myimage:1
结果在:
denied: Token exchange failed for project 'coopr-mod'. Caller does not have permission 'storage.buckets.create'. To configure permissions, follow instructions at: https://cloud.google.com/container-registry/docs/access-control
[我读过有关授予Google存储空间GKE read-write
权限的信息,但找不到它告诉我“如何”执行此操作的指南。
关于如何使用GCR和GKE同时推送和拉取图像,有不错的documentation。同样,对于常规GCE实例,this answer是类似的答案。
假设您的节点池使用默认的GCE帐户配置了实例,这是在创建池时使用read-write
访问范围配置池的简单问题。
几种方法:
--scopes https://www.googleapis.com/auth/devstorage.read_write
(或者,您可以使用以下值启用[所有作用域]:https://www.googleapis.com/auth/cloud-platform
,但这是例外情况)]...省略了许多范围选择...
[如果出于某种原因,您不能只是拆除节点池,那么有关如何将作业迁移到new machine type的说明应该对您有用(在这种情况下,“新计算机类型”具有新的访问权限)。基本步骤是:
也就是说,可能如果您不希望集群中的任何吊舱具有这种访问权限,则可以超出此范围,并使用专用的服务帐户(和密钥)来推送图像。 。同样,这不需要销毁并重新创建节点池。
这是一个相当复杂的数量,但是步骤大致是:
cat keyfile.json | docker login -u _json_key --password-stdin https://eu.gcr.io
(或任何适合您的正确GCR存储库主机名)