AWS CodeBuild에서 docker pull시의 에라 "You have reached your pull rate limit"을 AWS ECR을 사용하여 피하기

3241 단어 도커ECRCodeBuildAWS

처음에



이 기사는 Fusic Advent Calendar 2020의 18 일째 기사입니다.

소개하는 내용


  • AWS Codebuild에서 docker pull 너무 많아서 에러를 피하는 방법을 제안합니다.
  • AWS CodeBuild와 ECR을 만난 경험이 있는 분은 읽기 쉽다고 생각합니다


  • 결론



    AWS Codebuild에서 ECR에 대해 pull해 보더라도, 안된다면 Docker Hub에서 pull하여 ECR에 push한다.


  • You have reached your pull rate limit은 docker pull 횟수 제한이 엄격해졌기 때문입니다. pull처를 ECR로 바꾸면 횟수 제한을 신경쓰지 않아도 되는 것에 주목했습니다
  • ECR에 이미지가 있습니까? → 그렇지 않으면 Docker Hub에서 pull한다 → Docker Hub에서 pull 된 image의 tag를 ECR로 사용할 예정의 tag명으로 변경한다 → ECR로 사용할 예정의 tag명으로 변경할 수 있으면 image를 ECR로 push한다
  • 처음 한 번만 Docker Hub에서 pull합니다
  • 두 번째부터는 ECR에 image가 있기 때문에 Docker Hub에서 pull하지 않아도됩니다


  • 소개 시작



    우선은 엘라 화면입니다.





    Codebuild의 buildspec.yaml입니다.



    pre_build 단계와 build 단계가 말하고 싶은 부분입니다.
    version: 0.2
    
    phases:
      install:
        runtime-versions:
          ruby: 2.7
    
      # ECRへのログイン、ECRへのpushとpullに利用する変数定義
      pre_build:
        commands:
          - $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
          - AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
          - ECR_REPOSITORY_NAME=nomorelimit
          - WEB_URI=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${ECR_REPOSITORY_NAME}
    
      # ECRに欲しいdocker image(ECR_RUBY_URI)がないなら、Docker HubからpullしてECRにpushする
      build:
        commands:
          - ECR_RUBY_URI=$WEB_URI:ruby-2.7.1-slim
          - DOCKER_RUBY_URI=ruby:2.7.1-slim
          - docker pull $ECR_RUBY_URI || (docker pull $DOCKER_RUBY_URI && docker tag $DOCKER_RUBY_URI $ECR_RUBY_URI && docker push $ECR_RUBY_URI && true)
    
    

    pre_build 단계 자세한 설명


  • 1행:ECR에 로그인하는 부분입니다
  • 2 행, 3 행 : 이미 만들어진 ECR의 저장소 URI를 문자열로 결합하기 위해 얻었습니다
  • 4행 : 이미 만들어진 ECR의 리포지토리 URI를 문자열 조합 완성시킨 변수입니다

  • build 단계 상세 설명


  • 1행: ECR에서 사용하는 docker image의 tag명을 포함한 URI를 ECR_RUBY_URI으로 합니다
  • 2행: Docker Hub에서 pull하는 docker image의 원본 tag 이름을 포함한 URI를 DOCKER_RUBY_URI으로 합니다
  • 3행:
  • ECR에서 pull을 시도 docker pull $ECR_RUBY_URI || …
  • 괜찮다면 Docker Hub에서 pull합니다 || (docker pull $DOCKER_RUBY_URI …)
  • Docker Hub에서 pull이 성공하면, docker image를 ECR로 사용할 예정이었던 tag명 $ECR_RUBY_URI으로 바꿉니다 (… && docker tag $DOCKER_RUBY_URI $ECR_RUBY_URI …)
  • ECR에서 사용할 예정인 태그 이름 $ECR_RUBY_URI을 ECR로 푸시합니다. (… && docker push $ECR_RUBY_URI && true)


  • Dockerfile 활용 (보너스)



    ECR의 URI를 Dockerfile의 FROM에서 동적으로 사용할 수 있습니다.
    docker의 ARG를 사용하여 위에서 말한 ECR_RUBY_URI을 전달하게 됩니다.
  • CodeBuild에서 실행할 명령docker build --build-arg ECR_RUBY_URI=$ECR_RUBY_URI --file ファイルが/ある/パス/Dockerfile .
  • CodeBuild와 연계할 Dockerfile 내용
  • ARG ECR_RUBY_URI
    
    FROM $ECR_RUBY_URI
    # FROM ruby:2.7.1-slim
    
    …
    

    좋은 웹페이지 즐겨찾기