코딩은 마라톤

[FAIL] Github Actions을 이용해 Docker Cache 관리하고 싶었으나,, 본문

Backend/CI CD

[FAIL] Github Actions을 이용해 Docker Cache 관리하고 싶었으나,,

anxi 2024. 4. 21. 15:27

현재 Github Actions와 Docker를 이용해 CICD를 구축했다.

대략 1분 30초 정도 소요되는데 이 시간을 줄일 수 있는 방법이 있을지 찾아보다가 도커 캐시를 이용하면 시간을 단축할 수 있다고 알게 되었다.

 

Docker Layer, Cache

도커 캐시를 관리하기 위해선 도커 레이어를 먼저 알아볼 필요가 있다.

 

Docker Layer

 

도커 이미지는 Dockerfile의 명령어들이 차례로 실행되면서 레이어를 생성한다.

ubuntu는 A, B, C로 구성되어있고 그 ubuntu를 베이스로 가진 nginx 이미지는 nginx만 추가된다. 만약 레이어를 사용하지 않으면 Dockerfile 명령어가 실행되면서 동일한 작업이 반복되어 파일 용량이 커지고 이미지 생성 시간이 길어지게 되는 단점이 있다.

따라서 레이어 방식을 이용하여 기존 이미지 레이어에 레이어를 추가하기 때문에 굉장히 효율적으로 관리할 수 있다.

 

Docker Cache

 

도커 캐시는 Docker build 를 실행하게 되면 빌드 속도를 높이는데 사용된다. 첫 번째 빌드에서는 각 단계별 캐시를 생성하고, 이후 동일한 명령어가 실행되면 만들어둔 레이어를 재사용한다. 만약 변경되는 단계가 있다면 레이어는 다시 만들어진다. 

위 사진에서는 main.c 파일이 수정되었을 경우 FROM, RUN은 재사용되지만 COPY이후부터는 다시 실행된다.

 

Github Actions에서 도커 캐시 사용하여 빌드하기

Github Actions의 러너는 매번 새로운 가상환경에서 실행돼서 위처럼 레이어를 재사용하는 것이 아닌 모든 작업을 다시 새롭게 시작한다.

Github Actions에서 캐시 관리를 하기 위해선 buildx CLI 플러그인을 사용합니다. buildx 플러그인을 통해 위의 사진처럼 이미 빌드한 레이어를 재사용하고 중복 다운로드를 막을 수 있습니다.

 

따라서 buildx 플러그인과 Github Cache Backend API를 이용하여 빌드해보겠습니다.

 

 

추가해준 코드는 다음과 같습니다.

  • Set up Docker Buildx
  • Push to Docker 
    • cache-from: type=gha(git hub actions)
    • cache-to: type=gha, mode=max
    • mode=<min | max>: 내보낼 캐시 레이어 지정 (default: min)
      • min: 결과 이미지에 대한 레이어만 내보낸다.
      • max: 모든 중간 단계의 모든 계층을 내보낸다.

하지만,, 이렇게 했더니 

 

 

기존과 별 차이가 없었다,, 그래서 로그를 살펴보니,,

 

기존
현재

 

Github Actions에서 도커 캐시를 적용 전에도 이미 캐시를 사용하고 있었다,,

기존 workflow에는 도커 캐시 관련 설정을 해주지 않았고, Github Actions는 매번 새롭게 작업을 하기 때문에 캐시가 사용되지 않는게 맞다고 생각하는데,,,

 

결론적으로, 이 문제에 대해 해결하지 못했다.. 공식문서와 블로그를 찾아봐도 해결이 되지 않아서 좀 더 공부해보고 찾아봐야할 거 같다.

 

그 대신 다른 방법을 통해 시간 단축을 할 수 있었는데 바로 Docker Image를 Build하고 Push하는 과정을 합치는 것이다.

 

기존 : Build후 Push를 진행
현재 : Build와 Push를 동시 진행

 

이렇게 했더니 대략 5 ~ 10초정도 줄어들었다. 사실 유튜브를 보면서 CICD를 구축했던 거라 과정보단 구현에 중점을 둬서 왜 Build와 Push를 나눈 건지 잘 모르겠지만,,, 구현에 급급해하지 말고 동작 원리를 잘 알아야겠다고 생각했다.

 

또 다른 방법으로는 Dockerfile에서 JDK를 Alpine 리눅스 기반을 설치하면 이미지 크기를 줄일 수 있다고 한다. 

 

FROM openjdk:17-jdk-alpine

 

그래서 Dockerfile에 alpine 버전을 적용해주었더니

 

기본 JDK
alpine JDK

용량 또한 줄일 수 있게 되었다 !

'Backend > CI CD' 카테고리의 다른 글

Github Actions, Docker, EC2를 이용한 CI/CD 구현하기  (1) 2024.04.07