You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让GCE以机器身份认证拉取GCR中的Docker镜像?

解决GCE实例通过机器身份自动从GCR拉取Docker镜像的方案

核心思路

利用GCE实例的**机器身份(服务账号)**自动完成Docker与GCR的认证,无需手动登录或上传服务账号密钥,全程通过Terraform配置实现。


1. 配置服务账号与权限

确保GCE实例使用的服务账号拥有拉取GCR镜像的权限(GCR镜像存储在Cloud Storage中,需读取权限):

  • 若使用默认服务账号:给项目默认服务账号添加roles/storage.objectViewer角色
  • 若使用自定义服务账号:通过Terraform创建服务账号并绑定权限

Terraform配置示例:

# 自定义服务账号(可选,也可使用默认账号)
resource "google_service_account" "gcr_puller" {
  account_id   = "gcr-puller-sa"
  display_name = "GCR Puller Service Account"
}

# 绑定GCR拉取所需的权限
resource "google_project_iam_member" "gcr_puller_role" {
  project = "my-project"
  role    = "roles/storage.objectViewer"
  member  = "serviceAccount:${google_service_account.gcr_puller.email}"
}

2. 在实例启动脚本中自动配置Docker认证

在GCE实例模板的启动脚本中,通过gcloud auth configure-docker命令自动生成Docker认证配置,该命令会利用实例元数据服务获取的服务账号身份完成认证,无需手动交互:

启动脚本示例(适用于Debian/Ubuntu或Container-Optimized OS):

#!/bin/bash

# 安装gcloud SDK(若实例未预装,比如Debian/Ubuntu)
# apt-get update && apt-get install -y google-cloud-sdk

# 自动配置Docker与GCR的认证,--quiet参数跳过交互
gcloud auth configure-docker gcr.io --quiet

# 拉取最新镜像
docker pull gcr.io/my-project/my-image

# 后续启动容器的命令...

3. 通过Terraform配置实例模板

将上述启动脚本嵌入到Terraform的实例模板配置中,同时指定使用的服务账号:

resource "google_compute_instance_template" "app_template" {
  name_prefix = "app-instance-template-"
  machine_type = "e2-medium"

  # 指定服务账号(自定义或默认)
  service_account {
    email  = google_service_account.gcr_puller.email # 若用默认账号则填 "default"
    scopes = ["https://www.googleapis.com/auth/devstorage.read_only"]
  }

  # 启动脚本
  metadata = {
    startup-script = <<-EOT
      #!/bin/bash
      gcloud auth configure-docker gcr.io --quiet
      docker pull gcr.io/my-project/my-image
      # 启动容器命令示例
      docker run -d --name my-app gcr.io/my-project/my-image
    EOT
  }

  # 其他实例配置(镜像、磁盘等)
  disk {
    source_image = "debian-cloud/debian-11"
  }

  network_interface {
    network = "default"
  }
}

关键注意事项

  • 实例默认允许访问元数据服务,无需额外配置,gcloud会自动从元数据服务获取身份凭证
  • 遵循最小权限原则,仅给服务账号分配roles/storage.objectViewer即可满足拉取镜像需求
  • 若使用Container-Optimized OS(COS),gcloud与Docker已预装,可直接执行认证命令

内容的提问来源于stack exchange,提问作者Varid Vaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:00:53