将 Docker 映像从 GKE 中的容器 运行 推送到 Google Container Registry
Push a Docker image to Google Container Registry from a container running in the GKE
我有一个 GCP 项目。在那里,我将 GKE 与 Teamcity 容器 运行ning 一起使用。这个 Teamcity 容器是我的构建服务器,也是我 运行 我的构建 steps/scripts.
的位置
其中一个构建步骤想要将 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 构建 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
我读到过有关授予 GKE read-write
Google 存储权限的信息,但我找不到指导我 "how" 这样做的指南。
有不错的 documentation about how to both push and pull images with GCR and GKE. Also, this answer 是对常规 GCE 实例的类似答案。
假设您的节点池配置了使用默认 GCE 帐户的实例,这很简单,在创建池时使用 read-write
访问范围配置池。
实现此目的的几种方法:
- 当您使用 gcloud 创建节点池时,(另外)指定
--scopes https://www.googleapis.com/auth/devstorage.read_write
(或者,您可以使用此值启用 'all scopes':https://www.googleapis.com/auth/cloud-platform
,但这是非常宽松的)
- 在配置节点池时,在控制台中,select具体范围(默认仅读取)或select "all scopes",例如:
...省略了许多范围选择...
如果出于某种原因,您不能直接拆除节点池,有关如何将作业迁移到 new machine type 的说明应该适合您(在这种情况下,"new machine type" 仅具有新的访问权限)。基本步骤是:
- 创建新的节点池
- 封锁(标记为不可调度)现有节点池(并耗尽现有作业)
- 等待作业迁移
- 删除现有节点池
也就是说,如果您不想要任何 pod,可能 更进一步并使用专用服务帐户(和密钥)来推送图像是有意义的在您的集群上拥有这种访问权限。同样,这不需要销毁和重新创建节点池。
这要复杂得多,但步骤大致是:
- 创建一个具有必要角色的 IAM 帐户(可能 'Storage Object Admin' -- 但您需要能够在 first 推送时创建存储桶)。
- 为此 IAM 帐户生成密钥。
- 使用您的作业部署密钥文件(可能通过 GKE 密钥)
- Authenticate to docker with the key file:
cat keyfile.json | docker login -u _json_key --password-stdin https://eu.gcr.io
(或适合您的任何正确的 GCR 存储库主机名)
我有一个 GCP 项目。在那里,我将 GKE 与 Teamcity 容器 运行ning 一起使用。这个 Teamcity 容器是我的构建服务器,也是我 运行 我的构建 steps/scripts.
的位置其中一个构建步骤想要将 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 构建 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
我读到过有关授予 GKE read-write
Google 存储权限的信息,但我找不到指导我 "how" 这样做的指南。
有不错的 documentation about how to both push and pull images with GCR and GKE. Also, this answer 是对常规 GCE 实例的类似答案。
假设您的节点池配置了使用默认 GCE 帐户的实例,这很简单,在创建池时使用 read-write
访问范围配置池。
实现此目的的几种方法:
- 当您使用 gcloud 创建节点池时,(另外)指定
--scopes https://www.googleapis.com/auth/devstorage.read_write
(或者,您可以使用此值启用 'all scopes':https://www.googleapis.com/auth/cloud-platform
,但这是非常宽松的) - 在配置节点池时,在控制台中,select具体范围(默认仅读取)或select "all scopes",例如:
...省略了许多范围选择...
如果出于某种原因,您不能直接拆除节点池,有关如何将作业迁移到 new machine type 的说明应该适合您(在这种情况下,"new machine type" 仅具有新的访问权限)。基本步骤是:
- 创建新的节点池
- 封锁(标记为不可调度)现有节点池(并耗尽现有作业)
- 等待作业迁移
- 删除现有节点池
也就是说,如果您不想要任何 pod,可能 更进一步并使用专用服务帐户(和密钥)来推送图像是有意义的在您的集群上拥有这种访问权限。同样,这不需要销毁和重新创建节点池。
这要复杂得多,但步骤大致是:
- 创建一个具有必要角色的 IAM 帐户(可能 'Storage Object Admin' -- 但您需要能够在 first 推送时创建存储桶)。
- 为此 IAM 帐户生成密钥。
- 使用您的作业部署密钥文件(可能通过 GKE 密钥)
- Authenticate to docker with the key file:
cat keyfile.json | docker login -u _json_key --password-stdin https://eu.gcr.io
(或适合您的任何正确的 GCR 存储库主机名)