我正在使用 Google Cloud Build 构建部署管道并将 Docker 映像存储在 GCR 中。我计划在最新的 Cloud Build 步骤中重新启动 GCE 实例组,以便 GCE 可以通过在 GCE 实例模板启动脚本中添加
docker pull gcr.io/my-project/my-image
来运行最新的 docker 镜像。问题是我无法授权 docker 从 GCR 中提取映像。我已经阅读了4 GCR身份验证方法,但它们都要求我们从浏览器手动登录。此外,在这个阶段,我无法上传服务帐户密钥,因为我需要完全通过代码 (Terraform) 来配置和维护基础设施,无需 Google Cloud 控制台。那么我们如何验证 docker 作为机器呢?
如果实例未安装
gcloud
,您可以使用元数据服务获取访问令牌,并使用该令牌通过 Docker 登录 GCR。
我还没有使用它来使用 Docker 登录 GCR,但它应该可以工作。我使用这种格式从实例启动脚本访问 Google Cloud 服务:
echo "Getting token from metadata"
ENDPOINT="metadata.google.internal/computeMetadata/v1"
ACCOUNT="default" # Replace with Service Account Email (!)
TOKEN=$(\
curl \
--silent \
--header "Metadata-Flavor: Google" \
http://${ENDPOINT}/instance/service-accounts/${ACCOUNT}/token)
echo "Extract access token"
ACCESS=$(\
echo ${TOKEN} \
| grep --extended-regexp --only-matching "(ya29.[0-9a-zA-Z._-]*)")
echo "Login to Docker"
HOST="https://gcr.io" # Or ...
printf ${ACCESS} \
| docker login ${HOST} \
-u oauth2accesstoken \
--password-stdin
您可以向附加到 GCE 实例的服务帐户授予 IAM 权限或范围,然后运行以下命令:
gcloud auth print-access-token | docker login -u oauth2accesstoken \
--password-stdin https://HOSTNAME
这将针对注册表进行身份验证,并能够推送和拉取图像。