JIB를 사용해서 도커 빌드를 10초만에 끝내기
JIB 소개
그동안 CI/CD에 소요되는 시간에 지쳤다면, 혹은 도커파일 작성법을 잘 모르겠지만 도커 이미지를 만들고싶다면 JIB를 써보시는걸 추천합니다.
JIB는 구글에서 만든 JVM 언어 어플리케이션 컨테이너화 도구로 도커 데몬을 필요로 하지 않기 때문에 윈도우 컴퓨터에서도 별다른 설정 없이 빌드할 수 있습니다.
또한 도커 레이어 캐싱방식을 최대한 활용하여 dependency, resource, class 세 분류로 나누어 변경된 레이어만 빌드해주는 툴입니다.
실제 생성되는 도커파일과는 다를 수 있으나, 아래와 같은 느낌이라고 보시면 됩니다.
COPY target/dependencies /app/dependencies
COPY target/resources /app/resources
COPY target/classes /app/classesJIB 사용법
샘플 프로젝트 생성
spring starter를 사용해서 샘플 프로젝트를 만들어줬습니다.
저는 intellij ultimate를 가지고 있어서 인텔리제이에서 만들었습니다.

spring initializr 웹사이트에서 만들 수도 있습니다.

소스코드를 확인하고 싶으신 분은 https://github.com/Clickin/spring-jib-example 에서 확인해보세요.
Gradle plugin 설정
build.gradle 의 plugin 섹션에 다음 플러그인을 추가해줍니다.
id 'com.google.cloud.tools.jib' version '3.4.4' // 현재 최신 버전다음으로 만들어질 컨테이너 base image와 push할 대상 등을 설정합니다.
jib {
from {
image = 'eclipse-temurin:17-jre-alpine'
}
to {
image = 'clickin/spring-jib-example'
auth {
//DockerHub에 push하기 위해서는 Dockerhub 아이디와 비밀번호가 필요
username = USERNAME
password = PASSWORD
}
tags = ['latest']
}
}예제 코드 생성
동작 여부를 확인하기 위해 Hello, World 를 리턴하는 엔드포인트를 하나 만들었습니다.
package io.github.clickin.springjibexample.controller;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping(value = "/", produces = MediaType.TEXT_PLAIN_VALUE)
public ResponseEntity<String> hello() {
return ResponseEntity.ok("Hello, World");
}
}빌드 결과
./gradlew jib 로 커맨드라인에서 실행하거나, 혹은 인텔리제이 gradle 플러그인 내 다음 위치에서 jib 명령어를 실행해줍니다.

그러면 도커 데몬이 없어도 빌드가 잘 실행됩니다.
최초 빌드는 캐시 레이어가 없기 때문에 시간이 좀 걸립니다. 푸시까지 포함해서 50초정도 소요되었습니다.

실행 확인
실행을 위해서 Rancher Desktop 을 설치 후 로컬 쿠버네티스 환경에서 테스트하였습니다.
clickin/spring-jib-example:latest 이미지를 실행하고 8080 포트를 NodePort로 노출하는 간단한 Pod입니다.

NodePort는 30186으로 매핑되었네요.

웹브라우저에서 실제 잘 실행되는지 확인해봅니다.

변경 후 빌드 결과
그러면 레이어 캐싱의 효과를 보기 위해서 소스코드를 수정해보겠습니다.
Hello, World 를 Hello, Worlds 로 수정해봅시다.
package io.github.clickin.springjibexample.controller;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping(value = "/", produces = MediaType.TEXT_PLAIN_VALUE)
public ResponseEntity<String> hello() {
return ResponseEntity.ok("Hello, Worlds");
}
}이전과 동일하게 jib 빌드를 실행시키면 이번에는 5초정도밖에 걸리지 않습니다.

결론
JIB를 사용하면 굉장히 빠르고 쉽게 자바 어플리케이션을 컨테이너화할 수 있습니다.
본문에 소개된 내용 이외의 자세한 설정법은 https://github.com/GoogleContainerTools/jib/tree/master/jib-gradle-plugin#quickstart 를 참조해보세요.
혹시나 Maven에서 사용하고 싶으신 분은 https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin 에서 Maven 플러그인 사용법을 참조해보세요.
