ECR映像推送AWS CodeBuild问题

时间:2019-12-03 17:03:30

标签: amazon-web-services aws-codebuild ecr

COMMAND_EXECUTION_ERROR:执行命令时出错:$(aws ecr get-login --no-include-email --region us-east-1)。原因:退出状态127

下面是我的buildspec.yml文件

version: 0.2
phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws --version
      - $(aws ecr get-login --region ***-east-*)
      - REPOSITORY_URI=***********.dkr.ecr.***-east-*.amazonaws.com/repositoryname
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...          
      - docker build -t $REPOSITORY_URI:latest .
      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed
      - echo Pushing the Docker images...
      - docker push $REPOSITORY_URI:latest
      - docker push $REPOSITORY_URI:$IMAGE_TAG
      - echo Writing definitions file...
      - printf '[{"name":"project-container","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > taskdefinition.json
artifacts:
    files: taskdefinition.json


2 个答案:

答案 0 :(得分:0)

您的帖子中的信息不一致,是故意的吗?如果不是,则可能是导致问题的原因。您的代码段显示:

$(aws ecr get-login --region ***-east-*)

也许您故意编辑了该区域(那个btw的意义是什么?),但是为什么它缺少--no-include-email?在您的帖子的更高处,您确实引用了--no-include-email,所以我知道您知道这一点。

在子shell外部运行该进程以获得更好的日志

出于故障排除的目的,请不要将其运行在子shell(例如$(my command))中,而应尝试运行将子shell取出以获取更好的输出。在此处报告结果,以便我们排除您遇到的错误。

aws ecr get-login --no-include-email --region us-east-1 <-暂时尝试

vs。

$(aws ecr get-login --no-include-email --region us-east-1)

您是否创建了具有ECR权限的IAM策略以供CodeBuild使用?

这非常重要。 CodeBuild需要获得许可才能代表您访问ECR。这是我在此博客文章中找到的示例。它可能需要根据您的需要进行调整。 http://beta.awsdocs.com/services/code_build/build_docker_images/

{
    "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:CompleteLayerUpload",
        "ecr:GetAuthorizationToken",
        "ecr:InitiateLayerUpload",
        "ecr:PutImage",
        "ecr:UploadLayerPart"
    ],
    "Resource": "*",
    "Effect": "Allow"
}

答案 1 :(得分:0)

如果它对其他人有帮助,那么我将在CodeBuild执行的构建脚本中完成我的工作。这些是我必须添加的IAM权限(在遇到错误时一一找到)。

{
    "Action": [
        "ecr:GetAuthorizationToken",
        "ecr:DescribeRepositories",
        "ecr:CreateRepository",
        "ecr:InitiateLayerUpload",
        "ecr:UploadLayerPart",
        "ecr:CompleteLayerUpload",
        "ecr:BatchCheckLayerAvailability",
        "ecr:PutImage",
        "ecs:UpdateService"
    ],
    "Resource": "*",
    "Effect": "Allow"
}   ' 

我确定,如果您正在做一些我在构建中没有做的事情,那么可能需要更多的权限。我正在努力采用ECR,并强迫服务(及相关任务)部署新映像。