Git Action에서 Buildx를 사용하여 Docker Build 캐시적용 (with AWS ECR)

권민제·2022년 8월 25일
0

Docker

목록 보기
3/3
post-thumbnail

⚡️ Apply Docker Cache

Official build-push-action README
git action docker buildx

🧐 What Circumstance have to apply Buildx

  • CI/CD 툴로 Docker Image를 빌드 했을 때 캐시를 적용하면 빌드 시간이 단축되는 Dockerfile 일 때

기본적으로 CI/CD 툴을 사용해서 Docker 이미지를 빌드를 여러번 수행 했을 경우
로컬 환경해서 빌드를 여러번 했을 경우처럼 캐시가 적용되어서 변경 사항이 있는 이미지 레이어만 빌드 수행하기 때문에 빌드 시간이 줄어든다

하지만 Git Action에서는 Docker 이미지를 빌드하는 환경이 매 번 바뀌기 때문에
Git Action이 작동하는 가상환경에 캐시를 적용할 수 있는 이미지 레이어 데이터가 없어 캐시를 적용하기 위해서는
docker/build-push-action을 설정해주면 따로 이미지 데이터가 없어도 캐시를 적용시킬 수 있는 Cache backend API을 제공한다

이에 대한 자세한 Buildkit 내용은 여기에 있다 Buildkit

주로 많이 범용적으로 사용하는 AWS ECR에 이미지를 푸시하는 Action 파일을 작성하였다

use ECR Storage

name: Docker Build

on:
  push:
    branches:
      - 'main'

jobs:
  build:
    name: docker build and push
    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2
          
      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1
        
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: main Environment Docker build & Push Docker image to Amazon ECR
        uses: docker/build-push-action@v2
        if: contains(github.ref, 'main')
        env:
          ECR: ${{ steps.login-ecr.outputs.registry }}
          TAG: ${{ github.sha }}
        with:
          context: .
          push: true
          tags: |
            ${{env.ECR}}/tag:main
            ${{env.ECR}}/tag:main-${{env.TAG}}
          cache-from: type=gha
          cache-to: type=gha,mode=max
          build-args: |
            ENV=main

단순히 Git Action에서 캐시를 적용시킨다고만 해서는 빌드시간을 크게 단축할 수는 없고
기본적인 Dockerfile의 최적화도 진행해줘야한다 Dockerfile의 최적화 내용은 다음 포스트에서 다룰거다

profile
성장하는 개발자!

0개의 댓글