JVM

Google JIB

kyoulho 2024. 1. 30. 11:28

등장 배경


Jib 이전에 도커 이미지를 만들기 위해서는 dockerfile을 작성하고 dockerignore 파일을 작성하고 디펜던시들을 따로 분리해서 저장하고 분리된 의존성을 하나의 레이어로 관리하고 최대한 캐시를 활용해 다시 한번 dockerfile을 변경해야 했다.

이 모든 과정이 복잡하고 학습 난이도는 높으며 자주 하는 작업이 아니었기에 이전에 어떻게 했는지 다시 찾아보는 시간이 필요했다.

그래서 이 모든 과정을 단순하게 만들기 위해 Jib가 등장했다.

 

Jib의 장점


로컬 Docker 의존성 제거

Jib는 Dockerfile 작성 없이도 빌드 환경에 Docker가 없이도 이미지를 빌드할 수 있다. 이는 Jib가 컨테이너 이미지를 생성할 때, 애플리케이션 파일과 의존성을 레이어로 나누어 구성하는 방식을 사용하기 때문이다.

 

빌드 최적화

Google Jib는 빌드 과정에서 이미지를 효과적으로 생성하고 최적화하는 기능을 제공한다.

처음 빌드에서는 소스 코드와 의존성에 대한 해시값을 생성하고 각 레이어에 해당 빌드 시점의 해시값을 저장한다. 그 후의 빌드에서는 현재 소스 코드와 의존성에 대한 새로운 해시값을 생성하고, 이전 빌드에서 생성된 이미지와 비교하여 변경된 부분을 식별한다.

변경된 부분만을 업데이트하여 최적화된 이미지를 생성하며, 이는 레이어 구조를 활용하여 변경 사항이 발생한 부분만 해당 레이어가 업데이트되고, 안정된 레이어는 그대로 재사용된다.

 

이러한 빌드 방식 때문에 CI/CD 파이프라인에서 유의할 점이 몇 가지가 있다.

만약 동일한 환경에서 빌드되는 게 아니라면 변경된 부분만 업데이트되는 Jib의 특성상, 이전 빌드에서 생성된 이미지 레이어를 적절하게 캐싱하여 다시 빌드 시에 효율적으로 활용할 수 있도록 설정해야 한다. 이러한 설정이 없다면 새로운 빌드에서는 매번 처음부터 전체 이미지를 다시 빌드해야 하므로 빌드 시간이 증가하게 된다.

 

클라우드 네이티브 지원

Jib는 이미지를 Google Container Registry, Amazon ECR, Docker Hub와 같은 클라우드 레지스트리에 직접 푸시할 수 있는 기능을 제공합니다. 이는 클라우드 네이티브 환경에서의 배포에 편의성을 더해줍니다. 빌드된 이미지를 간편하게 클라우드에 푸시하여 서비스를 더 신속하게 업데이트할 수 있습니다.

 


build.gradle.kt

plugins {
    id("com.google.cloud.tools.jib") version "3.0.0"
}

jib {
    from {
        image = "adoptopenjdk:11-jre-hotspot"
    }
    to {
        image = "도커_이미지_이름:태그"
        tags = listOf("latest", "v1.0.0") // 여러 태그 지정
        credHelper = "gcr" // 도커 레지스트리 크레덴셜 도우미 설정
    }
    container {
        jvmFlags = mutableListOf("-Xms512m", "-Xmx1024m")
        mainClass = "com.example.MainApplication" // 메인 클래스 설정
        args = mutableListOf("arg1", "arg2") // Java 애플리케이션에 전달할 인수 설정
        ports = mutableListOf("8080", "9090") // 노출할 포트 설정
        environment = mapOf("KEY" to "value", "ANOTHER_KEY" to "another_value") // 환경 변수 설정
        labels = mapOf("version" to "1.0") // 이미지 레이블 설정
    }
    extraDirectories = listOf(file("additional-resources")) // 추가 리소스 디렉토리 지정
}
728x90

'JVM' 카테고리의 다른 글

StringBuffer vs StringBuilder  (0) 2024.07.22
java.security.invalidKeyException: Illegal Key Size  (0) 2024.05.04
자바 내부 클래스(Inner Classes)  (0) 2024.03.01
쓰레드 동기화  (0) 2024.03.01
JVM  (0) 2023.12.19