如何在Cloud Run中指向最新的容器镜像,当其路径根据版本变化时

53次阅读
没有评论

问题描述

希望在Terraform中模拟持续部署基础设施,但碰到一个问题:Cloud Run需要一个容器镜像的路径,而该镜像的路径根据其 ‘版本’ 的变化而变化。用户使用Cloud Build在每次git推送事件到GitHub仓库的main分支时进行构建,并推送镜像,镜像路径的格式如下:eu.gcr.io/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA。在Terraform中,用户想知道如何配置Cloud Run的镜像,特别是在初始基础设施部署时镜像路径尚不存在的情况下。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

为了解决这个问题,可以采取以下步骤:

使用通配符(Wildcards)来指定镜像

在Terraform的Cloud Run资源定义中,你可以使用通配符来指定镜像的路径。这将使得Cloud Run能够动态地指向最新的镜像,而不需要提前知道具体的版本号。在路径中使用通配符*来匹配版本号部分。

下面是一个示例的Terraform配置,展示了如何在Cloud Run中使用通配符来指定镜像路径:

resource "google_cloud_run_service" "example_service" {
  name     = "example-service"
  location = "us-central1"

  template {
    spec {
      containers {
        image = "eu.gcr.io/${var.project_id}/${var.repo_name}/${var.service_name}:*"
      }
    }
  }
}

在上述配置中,${var.project_id}${var.repo_name}${var.service_name}是变量,你需要根据实际情况设置它们的值。在image字段中,我们使用了通配符*来匹配版本号,这样Cloud Run会始终使用最新的镜像。

使用Cloud Build的输出来获取镜像路径

另一种方法是在Terraform中使用Cloud Build的输出来获取镜像路径。你可以在Cloud Build的构建步骤中将镜像路径输出到某个文件(例如一个.txt文件),然后在Terraform中读取该文件,从而获得镜像路径。这样可以确保在Terraform部署Cloud Run服务时,镜像路径已经存在。

以下是一个示例的Cloud Build配置和Terraform配置,展示了如何使用输出来获取镜像路径:

Cloud Build 配置(cloudbuild.yaml

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'eu.gcr.io/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA', '.']
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'eu.gcr.io/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA']
- name: 'gcr.io/cloud-builders/gcloud'
  args: ['secrets', 'versions', 'access', 'latest', '--secret=my-secret', '--data-file=/workspace/image_path.txt']

Terraform 配置

data "local_file" "image_path" {
  depends_on = [google_cloud_run_service.example_service]
  filename = "${path.module}/image_path.txt"
}

resource "google_cloud_run_service" "example_service" {
  name     = "example-service"
  location = "us-central1"

  template {
    spec {
      containers {
        image = file("${data.local_file.image_path.content}")
      }
    }
  }
}

在上述配置中,我们在Cloud Build中使用了一个名为image_path.txt的文件来存储镜像路径。然后,我们在Terraform的配置中使用了local_file数据源来读取该文件,然后将镜像路径传递给Cloud Run服务。

以上两种方法都可以让你在Cloud Run中动态地指向最新的容器镜像。你可以根据自己的需求选择其中一种方法来实现。

正文完