[Docker][GithubAction] Github Action 에서 docker build 캐싱 하기

이원찬·2024년 3월 4일

Docker

목록 보기
1/4

참고자료

GitHub Actions에서 도커 캐시를 적용해 이미지 빌드하기 | 카카오엔터테인먼트 FE 기술블로그

django 어플리 케이션을 Github Action 으로 배포를 자동화 해놓았었는데

name: Build And Deploy

on:
  pull_request:
    branches:
      - main
    types:
      - closed

jobs:
  deploy:
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Docker login
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Docker Build and Push
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:${{ github.event.pull_request.number }}, ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:latest

      - name: Deploy to EC2
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ubuntu
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'
            cd ~/${{ secrets.REPOSITORY_NAME }}
            sudo echo "${{ secrets.DOT_ENT }}" > .env
            sudo docker rm -f ${{ secrets.REPOSITORY_NAME }} || true
            sudo docker rmi -f ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:latest || true
            sudo docker run -d --name ${{ secrets.REPOSITORY_NAME }} -p 8001:8000 --env-file .env ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:latest

모든 dockerfile이 build 될때마다 너무 많은 시간을 소비 했다

특히 requirments.txt 를 pip install 하는 부분은 항상 고민이었다.

그렇게 docker/build-push-action@v2 액션에 구현되어있는 cache 기능을 이용해 도커 이미지 캐쉬를 이용하였다.

이미지 캐시를 이용한 workflow

name: Build And Deploy

on:
  pull_request:
    branches:
      - main
    types:
      - closed

jobs:
  deploy:
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

      - name: Docker login
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Docker Build and Push
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:${{ github.event.pull_request.number }}, ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:latest
          cache-from: type=gha
          cache-to: type=gha,mode=max

      - name: Deploy to EC2
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ubuntu
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'
            cd ~/${{ secrets.REPOSITORY_NAME }}
            sudo echo "${{ secrets.DOT_ENT }}" > .env
            sudo docker rm -f ${{ secrets.REPOSITORY_NAME }} || true
            sudo docker rmi -f ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:latest || true
            sudo docker run -d --name ${{ secrets.REPOSITORY_NAME }} -p 8001:8000 --env-file .env ${{ secrets.DOCKER_USERNAME }}/${{ secrets.REPOSITORY_NAME }}:latest

docker/build-push-action@v2 액션에서 with 절에서 사용된

cache-from: type=gha
cache-to: type=gha,mode=max

가 보인다.

위 처럼 작성하게 되면 requirements.txt 가 변경되지 않았다면 캐싱되어있는 도커 이미지 레이러를 사용하게 되어 더욱 빠른 docker build 가 가능하다.

필자는 1분 10초정도 이득을 봤다…

profile
소통과 기록이 무기(Weapon)인 개발자

0개의 댓글