You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 18:39:01