通过 AWS ECR 上的 Terraform 执行 Docker 映像构建和推送失败

问题描述 投票:0回答:1

我遇到了一个问题,无法使用 Terraform 成功构建 Docker 映像并将其推送到 AWS ECR。该过程似乎执行没有错误,但 ECR 存储库仍为空。我需要帮助了解可能出了什么问题。

目录结构:

  • main.tf(位于我的项目的根目录中)
  • pvf-stress-tests/(包含 Dockerfile 和 Docker 构建上下文的目录)

Terraform 代码:

resource "aws_ecr_repository" "pvf_stress_test" {
  name = "${random_pet.user.id}-ecr-pvf-stress-test"
  image_scanning_configuration {
    scan_on_push = true
  }
}

resource "null_resource" "docker_packaging" {
  depends_on = [aws_ecr_repository.pvf_stress_test]

  provisioner "local-exec" {
    command = <<EOF
      aws ecr get-login-password --region ${var.region} --profile ${var.account_prefix} | docker login --username AWS --password-stdin ${data.aws_caller_identity.current.account_id}.dkr.ecr.${var.region}.amazonaws.com
      docker build -t "${aws_ecr_repository.pvf_stress_test.name}:latest" -f pvf-stress-tests/Dockerfile pvf-stress-tests
      docker push "${aws_ecr_repository.pvf_stress_test.name}:latest"
    EOF
  }
}

当我运行

terraform apply
时,日志显示所有命令均已执行,没有任何错误,甚至 Docker 登录命令显示“登录成功”。但是,当我检查 AWS ECR 存储库时,它是空的。来自 Terraform 的日志在 Docker 构建或推送命令期间不会显示任何错误。

当从 main.tf 所在目录中的命令行手动执行 Docker 命令时,一切都按预期进行:Docker 映像已构建并成功推送到 ECR。

尝试解决:

  • 确保 Docker 的所有路径和上下文都是正确的。
  • 在 Terraform 之外手动执行 Docker 命令成功。
  • 检查了AWS IAM权限,一切似乎都是正确的。

有人可以帮助我理解为什么这些 Docker 命令在通过 Terraform 执行时不起作用吗?我的 Terraform 配置中可能缺少或需要调整什么?

预先感谢您提供任何见解或帮助!

amazon-web-services docker terraform
1个回答
0
投票

我通过将每个命令行拆分为本地执行配置程序解决了这个问题。

resource "null_resource" "docker_packaging" {

  depends_on = [
    aws_ecr_repository.pvf_stress_test,
  ]
  provisioner "local-exec" {
    command = "aws ecr get-login-password --region ${var.region} --profile ${var.account_prefix} | docker login --username AWS --password-stdin ${data.aws_caller_identity.current.account_id}.dkr.ecr.${var.region}.amazonaws.com"
  }

  provisioner "local-exec" {
    command = "docker build -t "${aws_ecr_repository.pvf_stress_test.name}:latest" -f pvf-stress-tests/Dockerfile pvf-stress-tests"
  }

  provisioner "local-exec" {
    command = "docker push ${data.aws_caller_identity.current.account_id}.dkr.ecr.${var.region}.amazonaws.com/${aws_ecr_repository.pvf_stress_test.name}:latest"
  }

  triggers = {
    "run_at" = timestamp()
  }
  
}
© www.soinside.com 2019 - 2024. All rights reserved.