使用 terraform 将 docker 镜像推送到 ECR

min*_*nie 15 docker dockerhub terraform terraform-provider-aws

使用 terraform 将公共映像从 Dockerhub(或只是自定义映像)拉取并重新加载到 ECR。我在想类似的事情

# Create ECR repository
resource "aws_ecr_repository" "ecr_repo" {
  name                 = var.ecr_name
}
# Docker image
resource "null_resource" "docker_hub" {
        ......
        ......
  depends_on = [aws_ecr_repository.ecr_repo]
}
Run Code Online (Sandbox Code Playgroud)

基本上创建一个 ECR 存储库,然后上传图像...我是 terrform 的新手,并且在这方面花费了大量时间。所以任何事情都会有所帮助。谢谢

小智 16

Terraform 实际上只是为了创建 AWS ECR 存储库和策略文档资源等基础设施而设计。可以使用local-exec 配置程序强制 Terraform 执行您想要的操作,这可以让您添加任意命令,但这并不是真正的最佳实践。正如他们在文档中提到的那样,Terraform 配置程序应被视为最后的手段。

最简单的方法是将 Terraform 与 Docker 和 AWS CLI 命令结合起来来构建和推送映像:

# ...terraform commands    
docker build -t ${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/${REPO} .

aws ecr get-login-password \
    --region ${REGION} \
| docker login \
    --username AWS \
    --password-stdin ${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com

docker push ${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/${REPO}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用HashiCorp Packer,它是为此目的(构建虚拟机/容器映像)而设计的,并且与 Terraform 具有良好的集成。但这意味着更多的学习曲线,因为 Packer 不使用 Dockerfile。无论如何,如果您沿着这条路走下去,您需要将Docker 构建器Docker 推送后处理器结合使用。

  • 我同意这个答案。我只想补充一点,您可以使用 [Amazon ECR Credential Helper](https://github.com/awslabs/amazon-ecr-credential-helper) 并跳过“aws ecr get-login-password”步骤。 (2认同)

Sha*_*ail 3

您将像以前一样使用该aws_ecr_repository资源,以及您想要在 ECR AWS 提供商中使用的任何其他资源。下面是 aws_ecr_repository_policy ,能够设置存储库的权限。

resource "aws_ecr_repository_policy" "demo-repo-policy" {
  repository = aws_ecr_repository.demo-repository.name
  policy     = <<EOF
  {
    "Version": "2008-10-17",
    "Statement": [
      {
        "Sid": "adds full ecr access to the demo repository",
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
          "ecr:BatchCheckLayerAvailability",
          "ecr:BatchGetImage",
          "ecr:CompleteLayerUpload",
          "ecr:GetDownloadUrlForLayer",
          "ecr:GetLifecyclePolicy",
          "ecr:InitiateLayerUpload",
          "ecr:PutImage",
          "ecr:UploadLayerPart"
        ]
      }
    ]
  }
  EOF
}
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用已使用的资源中的属性来执行docker push命令

docker push ${aws_account_id}.dkr.ecr.${region}.amazonaws.com/${repository-name}

以下教程中的更多信息 https://www.oneworldcoders.com/blog/using-terraform-to-provision-amazons-ecr-and-ecs-to-manage-containers-docker