728x90

jib 란?

 

Jib는 Dockerfile을 사용하지 않거나 Docker를 설치할 필요 없이 컨테이너를 빌드할 수 있도록 도와주는 도구이다.

특히 자바 컨테이너를 빌드하는 데 사용하는 도구이며, Maven과 Gradle 용 플러그인을 이용해 사용할 수도 있고 Jib 자바 라이브러리를 통해 사용할 수도 있다.

 

적용해보기

 

build.gradle.kts

plugin {
...
	id("com.google.cloud.tools.jib") version "3.1.2" apply false
...
}

 

버전은 해당 spring boot, kotlin, java 버전에 맞게 설정 이 필요하다.

 

val stage: String? by project // github action 에서 -Pstage=alpha 옵션으로 주입
val imageTag: String? by project // github action 에서 -PimageTag=AA-BB 옵션으로 주입

jib {
	from {} // 애플리케이션을 빌드할 기본 이미지를 구성
	to {} // 애플리케이션을 빌드할 대상 이미지를 구성
	extraDirectories {} // 이미지에 임의의 파일을 추가하는 데 사용되는 디렉토리를 구성
	container {} // 빌드된 이미지에서 실행되는 컨테이너를 구성
	mainClass = ""
	user = ""
	ports = "" // Dockerfile 의 EXPOSE 와 유사
	creationTime = "" // 컨테이너 생성 시간을 설정
}

 

github action 에서 환경과 imageTag 이름을 주입하기 위해 따로 변수를 생성한다.

 

github action

- name: Build tag, and push image with jib
  id: build-image
  run: |
    ./gradlew -PcontainerImage=${{ env.DOCKER_REPOSITORY }} -PimageTag=${{ env.IMAGE_TAG }} -Pstage=${{ env.PHASE }} jib --no-daemon

 

 

테스트 환경에서는 ECR 을 사용하여 docker image 를 관리하고 jib 에 다음과 같이 설정했다.

credHelper = "ecr-login"

 

jvm custom option

container {
    jvmFlags = when (stage) {
        "dev" -> listOf("-Xms4g", "-Xmx4g")
        "prod" -> listOf("-Xms8g", "-Xmx8g")
        else -> emptyList()
    }

    environment = mapOf("port" to 8080)
    mainClass = mainClassPath
    user = "user"
    ports = listOf(8080)
    creationTime = containerCreationTime
}

 

이런 식으로 튜닝도 가능하다.

 

체감상 docker build 에서 jib 로 바꾼뒤 캐시가 적중했을때 1분 가까이 차이가 나기도 한다.

728x90