如何获取Packer使用image family时对应的具体镜像名称?
问题解决:Packer构建GCE镜像时添加源镜像家族对应的具体镜像名标签
核心原因
Packer的googlecompute插件仅提供builder组件用于镜像构建,不支持类似Terraform的数据源(data block)来查询GCE镜像信息,因此你尝试的两种data块写法都会报错。
可行解决方案
方案1:构建前预查询源镜像名,作为变量传入
先通过gcloud命令查询目标镜像家族对应的最新镜像名称,再将其作为变量传入Packer配置:
- 在终端执行查询命令并导出环境变量:
export BASE_IMAGE_NAME=$(gcloud compute images list --family=你的镜像家族名 --project=你的项目ID --format="value(name)")
- 修改Packer配置,新增变量并在标签中引用:
variable "base_image_name" { type = string } source "googlecompute" "my-image" { project_id = var.project_id source_image_family = local.source_image_family image_labels = { "my_label" = "my_value", "label2" = var.label2_value, "base_image" = var.base_image_name } # 其他配置... }
- 构建时传入变量:
packer build -var "base_image_name=$BASE_IMAGE_NAME" 你的配置文件.pkr.hcl
方案2:使用Post-processor在构建后添加标签
利用Packer的shell-local后处理器,在镜像构建完成后,通过gcloud命令查询源镜像名并为新镜像添加标签:
source "googlecompute" "my-image" { project_id = var.project_id source_image_family = local.source_image_family image_labels = { "my_label" = "my_value", "label2" = var.label2_value } # 其他配置... } build { sources = ["source.googlecompute.my-image"] post-processor "shell-local" { inline = [ "BASE_IMAGE_NAME=$(gcloud compute images list --family=${local.source_image_family} --project=${var.project_id} --format='value(name)')", "gcloud compute images add-labels ${build.googlecompute.image_name} --labels=base_image=$BASE_IMAGE_NAME --project=${var.project_id}" ] } }
注:build.googlecompute.image_name是Packer内置变量,指向本次构建生成的新镜像名称。
注意事项
两种方案都要求运行Packer的环境已安装并配置好gcloud命令行工具,且拥有查询GCE镜像、修改镜像标签的权限。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

