packer(6)push packer artifact metadata to hcp packer registry

1. 启用 HCP Packer 注册表

  • 登录您的 HCP 账户。
  • 在左侧菜单中导航到 服务 (Services) 部分,选择 Packer
  • 如果注册表尚未启用,点击 创建注册表 (Create a registry) 进行设置。每个 HCP 项目只需执行一次。

注册账户

2. 创建服务主体进行认证

  • 在 HCP 项目仪表板中,从左侧导航菜单进入 **访问控制 (IAM)**。
  • 选择 服务主体 (Service principals) 选项卡,点击创建新服务主体(例如命名为 “packer”)。
  • 为此服务主体分配 贡献者 (Contributor) 角色,以便其与 Packer 注册表交互。
  • 创建完成后,进入该服务主体的 密钥 (Keys) 部分,点击 **生成密钥 (Generate key)**。
  • 复制并保存 客户端 ID (Client ID) 和 **客户端密钥 (Client Secret)**。

这些凭据将用于认证,密钥生成后无法再次查看,一定要copy

1.访问控制 (IAM)
77cfe77084f2861245e27ab2abdfb8ed.png

or

59fb0b3434b1c7304bb480cfa4350717.png

2.服务主体 (Service principals)
05447a08f625f43c5dbb0294df544a64.png

3.生成密钥 (Generate key)
4b026a5bf1b81aa14f39337feaad07a7.png

3. 设置认证环境变量

  • 在您的本地机器或构建环境中,使用上一步获得的客户端 ID 和密钥设置以下环境变量:
    1
    2
    export HCP_CLIENT_ID="您的客户端ID"
    export HCP_CLIENT_SECRET="您的客户端密钥"
  • 可选:如果您的 HCP 组织有多个项目,设置 HCP_PROJECT_ID 指定目标项目:
    1
    export HCP_PROJECT_ID="您的项目ID"
    (项目 ID 可在 HCP 项目设置中找到。如果使用 Packer v1.9.1 或更高版本且组织有多个项目,此项为必需。)

1.查看项目配置
78a53a4df4e794592da3cc644b3164d0.png

2.复制项目ID
fb99ef0d64831c0ec1dae66bf6a829ba.png

4. 配置 Packer 以推送元数据

您可以通过 环境变量(适用于 JSON 和 HCL2 模板)或在 HCL2 模板中添加 hcp_packer_registry(推荐用于自定义)来推送元数据。选择以下任一方法:

选项 A:使用环境变量
  • 设置存储元数据的 bucket 名称:
    1
    export HCP_PACKER_BUCKET_NAME="您的bucket名称"
    • 如果该 bucket 不存在,HCP Packer 将创建它;如果存在,则添加新版本。
  • (仅适用于 Packer v1.7.6 至 v1.8.3)显式启用注册表:
    1
    export HCP_PACKER_REGISTRY="ON"
  • 此方法无需修改 Packer 模板。
选项 B:使用 HCL2 模板(推荐)
  • 在 Packer HCL2 模板(例如 build.pkr.hcl)中添加 hcp_packer_registry 块。以下是示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    source "amazon-ebs" "example" {
    ami_name = "packer-example-{{timestamp}}"
    instance_type = "t2.micro"
    region = "us-east-2"
    source_ami = "ami-0c55b159cbfafe1f0" # 示例 Ubuntu AMI
    ssh_username = "ubuntu"
    }

    build {
    sources = ["source.amazon-ebs.example"]

    hcp_packer_registry {
    bucket_name = "我的packer-bucket"
    description = "我的应用程序示例 AMI"
    bucket_labels = {
    "团队" = "运维"
    "系统" = "ubuntu"
    }
    build_labels = {
    "版本" = "1.0.0"
    "日期" = "{{timestamp}}"
    }
    }
    }
    • bucket_name:HCP Packer 注册表中存储元数据的 bucket 名称。
    • description:构建的简要描述(最多 255 个字符)。
    • bucket_labels:应用于整个 bucket 的自定义键值对。
    • build_labels:特定于此构建版本的自定义键值对。
    • 注意:hcp_packer_registry 块需要 Packer v1.7.7 或更高版本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
source "docker" "ubuntu-focal" {
image = "ubuntu:focal"
commit = true
# pull = false
}

build {
hcp_packer_registry {
bucket_name = "learn-packer-ubuntu"
description = "Description about the image being published."

bucket_labels = {
"owner" = "platform-team"
"os" = "Ubuntu",
"ubuntu-version" = "Focal 20.04",
}

build_labels = {
"build-time" = timestamp()
"build-source" = basename(path.cwd)
}
}
sources = [
"source.docker.ubuntu-focal",
]
}

5. 验证前提条件

  • 确保已安装 Packer(推荐 v1.7.7+ 支持 HCL2,v1.9.1+ 支持多项目)。
  • 如果构建类似 AMI 的构件,配置云提供商凭据(例如 AWS)作为环境变量:
    1
    2
    export AWS_ACCESS_KEY_ID="您的访问密钥"
    export AWS_SECRET_ACCESS_KEY="您的密钥"

6. 构建构件并推送元数据

  • 使用您的模板运行 Packer 构建命令:
    1
    packer build build.pkr.hcl
  • Packer 将:
    1. 构建构件(例如上述示例中的 AMI)。
    2. 将元数据(而非构件本身)推送到 HCP Packer 注册表中的指定 bucket。
  • 查看输出以确认元数据推送,例如:
    –> amazon-ebs.example: 已将元数据发布到 HCP Packer 注册表 packer/我的packer-bucket/版本/<版本ID>
//配置HCP信息
➜  hcl export HCP_CLIENT_ID=xxx
export HCP_CLIENT_SECRET=yyy
export HCP_PROJECT_ID=zzzz

//构建镜像
➜  hcl packer build s5.pkr.hcl                              
Tracking build on HCP Packer with fingerprint "xxxx"
docker.ubuntu-focal: output will be in this color.

==> docker.ubuntu-focal: Creating a temporary directory for sharing data...
==> docker.ubuntu-focal: Pulling Docker image: ubuntu:focal
    docker.ubuntu-focal: focal: Pulling from library/ubuntu
    docker.ubuntu-focal: Digest: sha256:8e5c4f0285ecbb4ead070431d29b576a530d3166df73ec44affc1cd27555141b
    docker.ubuntu-focal: Status: Image is up to date for ubuntu:focal
    docker.ubuntu-focal: docker.io/library/ubuntu:focal
==> docker.ubuntu-focal: Starting docker container...
    docker.ubuntu-focal: Run command: docker run -v /Users/mvpbang/.config/packer/tmp2512693340:/packer-files -d -i -t --entrypoint=/bin/sh -- ubuntu:focal
    docker.ubuntu-focal: Container ID: fec8efdfaf9acff8c2abbdc892946a41a48c4f5de90f20d58bf6758c9e5c75ee
==> docker.ubuntu-focal: Using docker communicator to connect: 192.168.215.2
==> docker.ubuntu-focal: Committing the container
    docker.ubuntu-focal: Image ID: sha256:778c6f8e7fdef54c936299c1a1bffbf3c4e410f556a20e75db8bfc4df1efc372
==> docker.ubuntu-focal: Killing the container: fec8efdfaf9acff8c2abbdc892946a41a48c4f5de90f20d58bf6758c9e5c75ee
Build 'docker.ubuntu-focal' finished after 5 seconds 94 milliseconds.

==> Wait completed after 5 seconds 485 milliseconds

==> Builds finished. The artifacts of successful builds are:
--> docker.ubuntu-focal: Imported Docker image: sha256:778c6f8e7fdef54c936299c1a1bffbf3c4e410f556a20e75db8bfc4df1efc372
--> docker.ubuntu-focal: Published metadata to HCP Packer registry packer/learn-packer-ubuntu/versions/xxxxx

7. 在 HCP Packer 仪表板中验证元数据

  • 登录您的 HCP 账户,导航到 Packer 服务。
  • 在主仪表板中,找到 bucket 列表中的目标 bucket(例如 我的packer-bucket)。
  • 点击 bucket 查看其详细信息,包括描述和标签。
  • 从左侧导航选择 **版本 (Versions)**,查看每个构建的元数据,包括构件 ID 和创建时间。

d59f3d90a03ca194475f61e38ac8fcce.png


注意事项

  • HCP Packer 注册表仅存储元数据(例如构件 ID、区域、标签),不存储构件本身。
  • 使用环境变量时,它们会覆盖 hcp_packer_registry 块中指定的 bucket_name
  • 确保服务主体具有正确权限(贡献者角色),并且您的 Packer 版本支持所用功能。
  • 如果元数据推送失败(例如认证问题或缺少变量),检查 Packer 输出中的错误信息。

Refer