codebuild - 도커 이미지 cache 삽질

hyuckhoon.ko·2023년 5월 24일
0

TIL

목록 보기
41/69

도커 레이어 캐시가 왜 안되지?

codebuild 셋팅

아래와 같이
Cache Type에 `Local``
그리고 Docker layer cache와 Source cache를 적용했는데도 말이다.

buildspec.yml

version: 0.2

env:
  variables:
    DOCKER_BUILDKIT: "1"

phases:
  install:
    runtime-versions:
      docker: 20
  pre_build:
    commands:
      - echo "Logging in to Amazon ECR..."
      - ACCOUNT_ID=$(echo $CODEBUILD_BUILD_ARN | cut -f5 -d ':')
      - REPOSITORY_URI="${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/$ECR_REPO_NAME"
      - aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $REPOSITORY_URI
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-10)
      - IMAGE_TAG=$COMMIT_HASH

      - echo "Pulling previous recent Docker image..."
      - PREV_TAG=$(aws ecr describe-images --repository-name $ECR_REPO_NAME --query "sort_by(imageDetails,& imagePushedAt)[-1].imageTags[-1]" --output text)
      - docker pull $REPOSITORY_URI:$PREV_TAG || true
  build:
    commands:
      - echo "Building the Docker image..."
      - docker image build --cache-from $REPOSITORY_URI:$PREV_TAG -t $REPOSITORY_URI:$IMAGE_TAG . --build-arg DJANGO_ENV=$DJANGO_ENV

      - echo "Testing in progress..."
      - docker run --rm -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY $REPOSITORY_URI:$IMAGE_TAG python manage.py test
  post_build:
    commands:
      - echo "Pushing the Docker image..."
      - docker image push $REPOSITORY_URI:$IMAGE_TAG

      - echo "Making imageDetail.json..."
      - printf '{"name":"%s", "ImageURI":"%s"}' $ECR_REPO_NAME $REPOSITORY_URI:$IMAGE_TAG > imageDetail.json

      - echo Replacing AWS account ID in taskdef.json
      - sed -i.bak 's/AWS_ACCOUNT_ID/'"$AWS_ACCOUNT_ID"'/g' deploy/taskdef.json

artifacts:
  files:
    - imageDetail.json
    - deploy/taskdef.json

--cache-from 명령어로 도커 이미지를 빌드했음에도 build 시간에 50초가 소요되고 있었다.

Docker layer cache만 활성화하기

울며 겨자먹기로 Docker layer cache만 활성화하고
그 아래 Source cache는 해제했다.

50초에서 7초로 감소

결국 아래의 buildspec.yml에 적용한 도커 빌드에서의 로컬 cache 기능이 제대로 작동됨을 확인했다.

- docker image build --cache-from $REPOSITORY_URI:$PREV_TAG -t $REPOSITORY_URI:$IMAGE_TAG . --build-arg DJANGO_ENV=$DJANGO_ENV

--- 하지만 치명적인 문제가 있다
여러 의존성 파일이 항상 캐시되기 때문에 최신 버전의 의존성 패키지들이 설치되지 않게 된다.


참고자료

삽질을 하는데 도움이 된 자료는 아니지만, 처음 cache를 활용해 codebuild를 효율화 해야겠다는 인사이트를 준 자료들이다.

0개의 댓글