💻 Backend
구글이 말아주는 스프링부트 도커 이미지 with 코틀린
이제 도커와 쿠버네티스로 환경을 전환하는 기업이 많아진 것 같습니다.
웹 서비스를 하는 회사라면 특히 SpringBoot 를 많이 사용하실 것 같은데요!
이번 글에선 구글에서 제공해주는 오픈소스를 통해, SpringBoot 프로젝트를 쉽게 도커 이미지로 빌드하는 과정을 공유합니다 😃
JIB 는 무엇일까?
기존에 도커 이미지를 만드려면 DockerFile 이 필요했습니다.
일련의 스크립트를 통해 이미지를 빌드했던 지난 날을 뒤로하고, 이제는 플러그인으로 해결합니다. 😎
기존 방식은 이미 익숙할 것이라 생각해서 각설하고 본론부터 적어볼게요.
JIB를 정의하자면 다음과 같습니다.
구글에서 관리 및 제공하는 오픈소스로, Java 기반 어플리케이션을 자동으로 스캔하여 최적화된 DockerFile을 생성한 뒤 Docker Build를 대신 수행합니다. 특히, SpringBoot에 사용하기 용이합니다.
스프링 부트에서 사용하기
build.gradle 파일에 다음의 플러그인을 추가합니다.
id("com.google.cloud.tools.jib") version "3.4.0"
버전은 현재를 기준으로 최신입니다.
이후 같은 build.gradle 파일에 플러그인 익스텐션을 설정하면 끝입니다.
jib {
from {
image = 'eclipse-temurin:17'
}
to {
image = 이미지 레포지토리 주소
tags = [System.getProperty("image.tag")]
}
container {
creationTime = "USE_CURRENT_TIMESTAMP"
environment = [USE_PROFILE: System.getProperty("use.profile")]
# 실제 class path
mainClass = 'kr.abc.def.amdin.AdminApplication'
format = 'OCI'
}
}
JIB 플러그인 코드를 뜯어보면 설정 값으로 줄 수 있는 파라미터가 많습니다.
필요하신 튜닝은 직접 한번 확인해보세요!
참고로 위 build.gradle 은 코틀린입니다. 문법은 사용하는 그래들에 맞추어 수정하시면 됩니다.
이후 사용하는 CI 툴에서 빌드 스크립트에 다음 명령어를 씁니다.
./gradlew jib -Djib.to.image=${{ ecr_registry }} -Dimage.tag=${{ branch }}-$SHORT_SHA -Duse.profile=${{ branch }}
빌드가 수행되고 나면 적어둔 레포지토리로 도커 이미지가 업로드되어 있을겁니다.
코틀린을 더하면?
JIB 는 그 이름에서 알 수 있듯이 자바를 위한 오픈소스입니다.
그러나 같은 JVM 언어인 코틀린에서 쓰지 못할 리가 없겠죠.
실제 코틀린 프로젝트에 적용했을 때 이슈가 있었습니다.
container {
creationTime = "USE_CURRENT_TIMESTAMP"
environment = [USE_PROFILE: System.getProperty("use.profile")]
# 실제 class path
mainClass = 'kr.abc.def.amdin.AdminApplication'
format = 'OCI'
}
플러그인에 설정 값 중 메인 클래스를 찾지 못하는 이슈였어요.
정확하게 JIB의 이슈는 아니었고 코틀린으로 생성한 클래스를 찾는 방식이 달랐기 때문에 발생한 에러였습니다.
코틀린 클래스 파일은 className.kt 처럼 확장자가 붙는다는 것은 아실겁니다.
이게 실제로 클래스로 디컴파일 될 때는 어떻게 바뀔까요?
JAVA | KOTLIN |
Tea.kt | |
Tea.class | Teakt.class |
그냥 클래스 이름 뒤에 kt 가 추가됩니다.
디컴파일 할 때 클래스 이름을 주목해서 본 적은 없다보니 허무하지만 전혀 몰랐던 내용이에요.
때문에 만약 코틀린으로 스프링부트를 사용하시고, JIB를 도입하신다면 메인 클래스 매핑하는 부분에 KT를 추가하여야 정확한 메인 클래스를 찾을 수 있습니다.
너무 당연하게 사용하던 터라 인지하지 못하고 있던건데, JIB 덕분에 알게 됐네요 😂