아래와 같이
Cache Type에 `Local``
그리고 Docker layer cache와 Source cache를 적용했는데도 말이다.
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만 활성화하고
그 아래 Source cache는 해제했다.
결국 아래의 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를 효율화 해야겠다는 인사이트를 준 자료들이다.