我遇到了一个问题,无法使用 Terraform 成功构建 Docker 映像并将其推送到 AWS ECR。该过程似乎执行没有错误,但 ECR 存储库仍为空。我需要帮助了解可能出了什么问题。
目录结构:
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 执行时不起作用吗?我的 Terraform 配置中可能缺少或需要调整什么?
预先感谢您提供任何见解或帮助!
我通过将每个命令行拆分为本地执行配置程序解决了这个问题。
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()
}
}