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

使用Terraform构建镜像推送到ECR遇local-exec错误求助

问题解决:Terraform local-exec构建Docker镜像并推送到ECR失败

核心问题分析

  1. GitHub Actions语法不兼容:Terraform的local-exec无法识别GitHub Actions的${{ secrets.CMS_GIT_TOKEN }}语法,导致构建参数无法正确获取令牌,触发构建失败。
  2. 路径不一致:错误日志显示命令执行了cd ./../src,但你的代码中写的是cd ${path.module}/../docker,路径不匹配会导致找不到Dockerfile,直接引发exit status 1。
  3. Docker登录警告非直接错误:日志中的密码存储警告只是提示,不是导致命令失败的原因,无需优先处理。

修复步骤

1. 在GitHub Actions中传递Secrets到Terraform

在运行Terraform的GitHub Actions步骤里,将Secrets以环境变量形式传入:

- name: Run Terraform
  env:
    CMS_GIT_TOKEN: ${{ secrets.CMS_GIT_TOKEN }}
  run: |
    terraform init
    terraform apply -auto-approve

2. 修改Terraform代码,使用环境变量获取令牌

将local-exec中的GitHub Actions语法替换为系统环境变量引用,同时修正路径:

data "aws_caller_identity" "current" {}
locals {
  account_id    = data.aws_caller_identity.current.account_id
  ecr_repo_name = "ecr-repo"
  ecr_image_tag = "latest"
  docker_dir    = "${path.module}/../docker" # 定义Docker目录变量,避免路径错误
}
resource "aws_ecr_repository" "repo" {
  name = local.ecr_repo_name
}
resource "null_resource" "ecr_image" {
  triggers = {
    docker_file = md5(file("${local.docker_dir}/Dockerfile"))
  }
  provisioner "local-exec" {
    command = <<EOF
        aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin ${local.account_id}.dkr.ecr.eu-west-1.amazonaws.com
        cd ${local.docker_dir}
        docker build -t ${aws_ecr_repository.repo.repository_url}:${local.ecr_image_tag} --build-arg cms_git_token="$CMS_GIT_TOKEN" .
        docker push ${aws_ecr_repository.repo.repository_url}:${local.ecr_image_tag}
    EOF
  }
}
# 可选:新增变量定义,提升代码规范性
variable "cms_git_token" {
  type        = string
  sensitive   = true
  description = "GitHub token for CMS repo access"
}

若使用上述变量定义,需在GitHub Actions的terraform apply命令中补充参数:terraform apply -auto-approve -var cms_git_token="$CMS_GIT_TOKEN"

3. 验证路径正确性

可在local-exec中添加ls命令,确认Docker目录下的文件:

cd ${local.docker_dir} && ls -l

额外优化建议

  • 避免在local-exec中执行复杂命令链,可将Docker构建逻辑写入单独的Shell脚本,Terraform调用脚本并传递参数,提升可维护性。
  • 使用Terraform的docker_image资源替代local-exec,更符合基础设施即代码的规范,减少命令执行的不确定性。

内容的提问来源于stack exchange,提问作者Rajeev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:05:17