使用 HCP Packer 和 Terraform 管理云容器注册表
作者:Bruce Harrison
本指南将帮助你使用 HCP Packer 创建和管理 Docker 容器,并将其与云服务提供商 (CSP) 容器注册表接口。本指南将演示如何将镜像推送到 AWS、Azure 和 GCP 容器注册表。
本指南同时使用 Packer CE 和 HCP Packer 平台。你将使用 Packer CE 构建容器和虚拟机镜像。你将使用 HCP Packer 存储 Packer CE 生成的容器和虚拟机元数据。
通过使用 Packer CE 和 HCP Packer,你将获得以下好处
- HCP 平台捕获容器元数据
- 容器血缘的可视性
- 当由于父版本的发布而使派生镜像过时时,会发出通知
- 利用 HCP Packer Webhook 实现更高级的云提供商注册表管理
- 虚拟机镜像和容器可以共享一个通用的声明性文件格式 (Packer HCL),用于描述和构建两者。
目标受众
本指南参考了以下角色
- 平台运维人员:负责设置镜像仓库、构建容器并将它们推送到各个云提供商容器注册表的人员。
已验证的架构
下图显示了使用 HCP Packer 将容器推送到云提供商容器注册表的过程。

本文档重点介绍从本地计算机运行此过程,但相同的概念可以轻松应用于 CI/CD 机制,例如 Github Actions 或 Gitlab Runners。
我们建议使用 Terraform 来配置底层基础设施。
由于 Packer 后处理器和 docker 登录的工作方式,如果你计划将镜像推送到多个云提供商,则应在隔离的上下文中运行每个构建。尝试从单个上下文并行推送多个镜像可能会导致临时故障,因为它们都竞争
docker login访问权限。Packer 提供一个
docker-push后处理器,但本指南不涵盖此后处理器。该后处理器本质上缺乏灵活性,并导致跨云提供商的容器推送流程出现广泛差异。相反,您将手动登录到注册表并推送容器。此方法也广泛适用于 CI/CD 场景。每个云提供商对凭据处理方式都有独特的限制。本指南为了简洁起见使用长期凭据,但这可能不适用于所有组织。
平台运营商应咨询其内部安全团队,以确保云提供商的身份验证方法符合公司政策和实践。
先决条件
- 一个活动的 HCP 服务主体。
- 一个现有的 HCP Packer 帐户 (HCP 平台)。
- Packer OSS CLI >=v1.11.0 已安装。
- 准备好配置用于构建 Docker 容器的 Packer HCL 文件。
- 已安装 Git CLI。
对于您所需的云提供商,请确保您拥有以下内容
- 在您选择的云提供商中创建资源的必要权限。
创建镜像仓库
您可以使用 Terraform 或 AWS CLI 创建镜像仓库。
使用以下 Terraform 配置来部署 AWS Container Repository。此配置使用 aws_ecr_repository 资源。将 <repository-name> 替换为您想要创建的仓库的名称。
resource "aws_ecr_repository" "demo" {
name = "<repository-name>"
image_tag_mutability = "IMMUTABLE"
image_scanning_configuration {
scan_on_push = true
}
}
output "repository_url" {
value = aws_ecr_repository.demo.repository_url
}
创建 AWS 镜像仓库后,存储输出中的 repository_url 值。此值将是您应用于要发送到 AWS ECR 的镜像的 Docker 标签。将容器推送到仓库时,您的本地 AWS 凭据将用于授权。
将容器推送到注册表
找到您的 HCP 服务主体凭据,并将其导出为环境变量。
$ export HCP_CLIENT_ID=
$ export HCP_CLIENT_SECRET=
在 Packer 模板中,更新以下字段
- 将
<region>替换为您部署镜像仓库的区域。 - 将
<aws-account-number>替换为您部署镜像仓库的帐户号码。 - 将
<repository-name>替换为您创建的镜像仓库的名称。
构建容器。
$ packer build docker-debian-aws.pkr.hcl
通过 AWS CLI 登录 ECR。将 <region> 替换为您部署镜像仓库的区域。将 <aws-account-number> 替换为您部署镜像仓库的帐户号码。
$ aws ecr get-login-password --region <region> | \
docker login --username AWS --password-stdin <aws-account-number>.dkr.ecr.<region>.amazonaws.com
将容器推送到 ECR。将 <repository-name> 替换为您创建的镜像仓库的名称。
$ docker push <aws-account-number>.dkr.ecr.<region>.amazonaws.com/<repository-name>:latest
您已将您的镜像推送到 AWS 仓库。现在,具有拉取权限的服务可以使用它。
结论
在本指南中,您学习了如何使用 Packer CE 和 HCP Packer 将容器推送到云提供商的容器注册表。要了解更多信息,请查看以下资源