如何使用Terraform将Docker镜像推送至AWS ECR仓库?
基于Terraform实现Docker Hub镜像同步到AWS ECR方案
前置依赖
执行Terraform的环境需要提前满足以下条件:
- 已安装Docker服务且处于运行状态
- 已安装AWS CLI v2
- 已配置拥有ECR读写权限的AWS身份凭证
完整实现代码
# 获取当前AWS账号、区域信息,避免硬编码 data "aws_caller_identity" "current" {} data "aws_region" "current" {} # 自定义变量,可单独维护到variables.tf文件 variable "ecr_name" { type = string description = "ECR仓库名称" default = "synced-nginx" } variable "source_docker_image" { type = string description = "Docker Hub源镜像,需携带标签,例:nginx:alpine、your-custom-image:v1" default = "nginx:alpine" } variable "ecr_image_tag" { type = string description = "同步到ECR后的镜像标签" default = "latest" } # 创建ECR仓库 resource "aws_ecr_repository" "ecr_repo" { name = var.ecr_name } # 执行镜像拉取、打标、推送逻辑 resource "null_resource" "sync_image_to_ecr" { # 触发条件:源镜像、ECR地址变更时才重新执行同步 triggers = { source_image = var.source_docker_image ecr_repo_url = aws_ecr_repository.ecr_repo.repository_url image_tag = var.ecr_image_tag } provisioner "local-exec" { command = <<EOT # 登录ECR aws ecr get-login-password --region ${data.aws_region.current.name} | docker login --username AWS --password-stdin ${data.aws_caller_identity.current.account_id}.dkr.ecr.${data.aws_region.current.name}.amazonaws.com # 拉取Docker Hub源镜像 docker pull ${var.source_docker_image} # 给镜像打ECR格式标签 docker tag ${var.source_docker_image} ${aws_ecr_repository.ecr_repo.repository_url}:${var.ecr_image_tag} # 推送镜像到ECR docker push ${aws_ecr_repository.ecr_repo.repository_url}:${var.ecr_image_tag} # 可选:清理本地镜像,释放存储空间 docker rmi ${var.source_docker_image} ${aws_ecr_repository.ecr_repo.repository_url}:${var.ecr_image_tag} EOT } depends_on = [aws_ecr_repository.ecr_repo] }
注意事项
- 如果源镜像是Docker Hub私有镜像,需要先在执行Terraform的环境执行
docker login登录Docker Hub后再运行terraform apply - 如需批量同步多个镜像,可将ECR仓库和null_resource资源改为用
for_each参数批量创建 - 若执行时提示权限错误,需检查当前AWS身份凭证是否包含ECR读写、镜像上传相关的权限策略
- 如需保留本地镜像,删除local-exec代码块最后一行的镜像清理命令即可
内容的提问来源于stack exchange,提问作者minnie
相关产品推荐
相关产品推荐

