자동 배포를 위해 GitHub Actions를 사용했지만, 전체 빌드 시간이 길어지는 문제가 있었다.
특히 "RUN pip install -r requirements.txt" 명령어에서 매번 의존성 패키지를 새로 설치하면서 시간이 많이 소요됐다.
이를 개선하기 위해 캐시를 활용하여 변경 사항이 없을 경우 이전 빌드의 결과를 재사용하도록 설정했고, 이를 통해 빌드 속도를 크게 줄일 수 있었다.
BuildKit을 활용한 Docker Build 캐싱
기존의 Docker 빌드는 모든 단계의 레이어를 매번 새로 생성하기 때문에 빌드 시간이 길어질 수밖에 없었다. 이를 해결하기 위해 Docker 팀이 도입한 BuildKit은 변경된 단계 이후만 재빌드하는 방식으로 효율성을 높인다.
이제 BuildKit을 활용하면 Docker Hub나 다른 외부 저장소에 캐시를 저장하고, 이를 기반으로 빌드를 최적화할 수 있다.
GitHub Actions에서 Docker Build 캐싱
deploy:
needs: test
if: success()
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Docker login
run: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
# caching 적용
- name: Docker Build & push & cache
uses: docker/build-push-action@v3
with:
context: .
file: backend/Dockerfile
push: true
tags: ${{ secrets.DOCKER_USERNAME }}/project_image:latest
cache-from: type=registry,ref=${{ secrets.DOCKER_USERNAME }}/project_image:latest
cache-to: type=inline
- name: Setup SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.ORACLE_SSH_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan -H 0.0.0.0 >> ~/.ssh/known_hosts
- name: Docker compose run on Oracle
run: |
ssh ubuntu@0.0.0.0 << 'EOF'
docker pull ${{ secrets.DOCKER_USERNAME }}/project_image:latest
cd project
코드 설명
name: Docker Build & push & cache : 이름
uses: docker/build-push-action@v3: Docker 명령어(docker build, docker push)를 직접 쓰는 대신 이 액션이 내부에서 BuildKit을 활용한다.
context: . : 경로로 현재 디렉토리 전체를 Docker가 빌드할 때 참고한다.
file: backend/Dockerfile : Dockerfile의 위치.
push: true : 빌드가 완료되면 Docker Hub에 이미지를 업로드하라는 옵션.
tags: ${{ secrets.DOCKER_USERNAME }}/project_image:latest : 이미지 태그.
cache-from : 캐시 소스로 사용할 이미지를 지정. type=registry 을 통해 docker Hub에 저장.
cache-to : 캐시 저장 대상을 지정. type=inline 캐시정보도 이미지내부에 포함.
빌드 시간 비교
구분 | 캐시 적용 전 | 캐시 적용 후 |
1차 빌드 | 2m 51s | 2m 54s |
2차 빌드 | 2m 55s | 40s |
3차 빌드 | 2m 57s | 37s |
첫 번째 빌드에서는 캐시를 만들기 때문에 시간 차이가 없지만, 이후 반복되는 빌드에서는 캐시 덕분에 시간이 대폭 단축된다.
테스트 Job에도 pip 캐시 적용
Docker 빌드 외에도 테스트 단계에서도 pip 패키지 설치에 캐시를 적용할 수 있다.
#.github/workflows/cicd.ymal
...
- name: Cache pip dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ubuntu-latest-pip-${{ hashFiles('backend/requirements.txt') }}
restore-keys: |
ubuntu-latest-pip-
테스트 실행시에도 pip를 통해 의존성 파일을 설치하는데 변화가 없으면 가져와서 사용하도록 했다.
40s → 33s 정도로 시간이 단축 되었다.
이 설정을 통해 requirements.txt에 변화가 없을 경우 pip 캐시를 재사용하게 하여 테스트 시간도 절약된다. 실제로 약 40초 → 33초로 단축되는 효과가 있었다.
마무리
GitHub Actions와 BuildKit을 활용한 Docker 캐시 적용은 반복적인 배포 속도를 비약적으로 향상시킨다. 특히 Docker 이미지 빌드와 pip 설치 과정에서 불필요한 중복 작업을 제거함으로써 CI/CD 파이프라인 시간을 단축 시킬 수 있다.
참고
https://velog.io/@leeeeeyeon/Github-Actions과-Docker을-활용한-CICD-구축
https://velog.io/@tkdwns414/GitHub-Actions로-간단한-CICD-구축하기Feat.-Docker-Hub-EC2
'Docker' 카테고리의 다른 글
Docker와 GitHub Actions로 구축하는 CI/CD (2): 자동배포(CD) (0) | 2025.04.13 |
---|---|
Docker와 GitHub Actions로 구축하는 CI/CD (1) : 지속 통합(CI) (0) | 2025.04.11 |
맥북 오라클 데이터베이스 연결 + Docker (0) | 2025.03.17 |
MySQL과 Docker를 활용한 오라클 클라우드 연결 (0) | 2025.02.26 |
Docker를 활용한 서버 배포 (4) : Docker-Compose로 Django 배포하기 (1) | 2024.12.31 |