기존 문제 상황
Github Repository에 코드를 올리고 Github Action을 사용해서 Docker 이미지 빌드하고 ECR에 Push 해서 사용을 했는데,
매 번 이미지 빌드를 할 때 마다 시간이 너무 오래걸렸음.
이에 따라 어떻게 하면 시간이 줄일 수 있는 지 방법을 찾아보다가
BuildKit + buildx + GitHub Actions 캐시
사용하는 방법을 알게되어 적용 해봤습니다.
왜 BuildKit + buildx 캐시를 적용하면 빌드 속도가 빨라질까?
Docker 빌드는 내부적으로 여러 단계로 나뉘어 실행이 됩니다.
Dockerfile의 각 명령어(FROM, RUN, COPY, ENV 등)는 "레이어(layer)" 라는 형태로 쌓이고,
이 레이어들은 모두 해시(hash) 값으로 관리됩니다.
기존 빌드의 문제점
Github Action 을 실행할 때 마다 매번 새로운 러너(가상머신)가 실행되도록 하였습니다.
이 때문에 이전 Action에서 빌드했던 /var/lib/docker 캐시가 사라지기 때문에
빌드를 매번 할 때 마다, 아래와 같이 처음부터 다시 실행이 됩니다.
ex)
FROM node:20
RUN npm install
COPY . .BuildKit과 Buildx의 역할
BuildKit 은 Docker의 고성능 빌드 엔진으로,
각 단계별로 병렬 처리와 캐시 저장/복원을 더 똑똑하게 관리해줍니다.
그리고 Buildx는 이 BuildKit을 GitHub Actions에서 사용할 수 있도록 도와주는 확장 툴이에요.
즉 간단하게 설명을 해보자면,
BuildKit은 “같은 명령어 + 같은 입력 파일 해시”를 보면
“이전 레이어와 동일하네? → 재사용하자!”
이렇게 판단하고 바로 건너뜁니다.
GitHub Actions 캐시(type=gha)의 역할
문제는 Action 환경이 매번 새로운 러너(가상머신)에서 실행이 되니까
로컬 캐시가 유지가 되지 않습니다.
이러한 문제를 해결하기 위해 cache-from/cache-to 라는 옵션을 사용을 합니다.
- cache-from: 이저 빌드의 캐시 데이터를 Github Action 저장소에서 불러옴
- cache-to: 현재 빌드의 결과를 Action 저장소에 저장
이렇게 하면 Actions가 빌드 레이어를 외부 저장소(GHA 캐시)에 보존했다가
다음 빌드 때 다시 불러와서 그대로 재활용합니다.
실제로 Github Action YAML 파일에서 어떻게 사용을 했는 지 알아보겠습니다.
해결 방안 - BuildKit + Builx + Github ACtion 캐시 사용
- Buildx를 docker/setup-buildx-action@v3으로 설치
- build-push-action@v6에서 cache-from, cache-to를 추가
- GHA 캐시를 이용해 레이어 재사용 가능하게 변경
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: set up Buildx (container driver) # 여기서 BuildKit 툴 사용할 수 있도록 환경 설정
uses: docker/setup-buildx-action@v3
- name: Build and push Docker image # 이 단계에서 이미지 Build/Push 진행
uses: docker/build-push-action@v6
with:
# 현재 레포지토리의 루트에서 빌드를 수행한다는 의미 (.)
context: .
# 사용할 Dockerfile의 경로 지정
file: ./transports/Dockerfile
# 이미지의 아키텍처 정의
platforms: linux/amd64
# push 여부 확인
push: true
# 이미지 태그 지정
tags: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ env.BUILD_TAG }}
# 캐시를 가져올 위치 지정
# 이전 빌드에서 생성된 레이어 캐시를 Github Action 저장소 (GHA)에서 불러옴
cache-from: type=gha
# 이번 빌드 결과를 Github Action 캐시 스토리지에 저장
# mode=max -> 가능한 모든 빌드 레이어를 저장 (캐시 적중률 향상을 위함)
cache-to: type=gha,mode=max 이렇게 설정을 하고 이전에 빌드했던 이미지의 내용과 비슷한 이미지를 다시 빌드하면 시간이 엄청나게 단축 된 것을 확인할 수 있습니다.

이전에는 5분이 넘게 걸리던 작업이 38초 로 줄어든 것을 확인 할 수 있습니다.
이상 입니다.
'Pipeline' 카테고리의 다른 글
| “Helm + ArgoCD + ApplicationSet으로 구축하는 PR Preview 환경 (3편: Preview 환경 배포하기)” (0) | 2025.09.16 |
|---|---|
| “Helm + ArgoCD + ApplicationSet으로 구축하는 PR Preview 환경 (2편: Helm 차트 구성)” (2) | 2025.09.12 |
| “Helm + ArgoCD + ApplicationSet으로 구축하는 PR Preview 환경 (1편: 아키텍처)” (0) | 2025.09.11 |
| ArgoCD 배포 완료 시, Google-Chat으로 알림 보내기 (Helm 차트의 values.yaml 파일 수정) (0) | 2025.06.23 |
| Blue - Green 배포 실습 해보기 (1) | 2024.12.20 |