상세 컨텐츠

본문 제목

Jib란? (+ M1 Mac에서 빌드하기 & Kotlin DSL)

Log.Develop/SpringBoot

by bluayer 2021. 9. 6. 12:38

본문

서론

M1 Mac에서 Jib를 이용하여 스프링 부트 프로젝트를 빌드하는 것에는 성공했으나, 실행할 때 알 수 없는 이유로 실패했다.

(정확하게는 configuration 관련 빈들을 생성할 때 meta-data를 읽지 못해 생기는 이슈인 것으로 파악했다.)

(오류명: Unable to read meta-data..)

이 기회에 Jib에 대해서 좀 더 알아보고 정리한 다음,

M1 Mac에서 어떻게 하면 Jib 이미지를 정상적으로 빌드할 수 있는지에 대해서 소개하고자 한다.

또한 Kotlin DSL로 작성한 내용도 추가하였다.

 

M1 Mac 관련 이슈만 궁금하신 분들은 Getting Started의 1-1을 보시면 된다.

 

What is Jib?

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

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

프로젝트에서 Jib를 이용하면 Docker Image를 뚝-딱 만들 수 있는 것이다.

그러니깐, Github action 등에서 이미지 빌드를 할 때 Docker Daemon이 필요 없다는 이야기다!

또한 빌드할 때 변경 사항만 이미지에 반영하기 때문에 매우 빠르다고 한다.

 

도커 빌드 흐름

 

Jib 빌드 흐름

 

Getting Started

참고로 아래의 Jib 관련 내용 작성 환경은 다음과 같다.

  • Spring Boot
  • Gradle 7.2

 

1. gradle 설정에 해당 플러그인을 추가해준다.
(2021-09-06 기준 3.1.4가 major버전이다.)

jib/jib-gradle-plugin at master · GoogleContainerTools/jib

 

GitHub - GoogleContainerTools/jib: 🏗 Build container images for your Java applications.

🏗 Build container images for your Java applications. - GitHub - GoogleContainerTools/jib: 🏗 Build container images for your Java applications.

github.com

 

// build.gradle
plugins {
	...
    id("com.google.cloud.tools.jib") version "3.1.4"
	...
}

jib {
    from {
        image = "adoptopenjdk/openjdk11"
    }
    to {
    	// image 이름
        // 여기서는 build.gradle에 설정되어 있는 project의 이름과 버전을 이용했다.
        // lowercase를 사용한 이유는 도커 이미지 이름에 대문자 사용이 불가능하기 때문이다.
        image = "${project.name}-${project.version.toString().toLowerCase()}"
        
        // image tag는 여러 개 적을 수 있다.
        tags = ["latest"]
    }
    container {
        creationTime = "USE_CURRENT_TIMESTAMP"
        // JVM 옵션들
        // 서버 포트로는 8080을 사용했으며, profile로는 local을 선택했다.
        
        jvmFlags = ['-Dspring.profiles.active=local', '-XX:+UseContainerSupport', '-Dserver.port=8080', '-Dfile.encoding=UTF-8']
        
        // 컨테이너가 외부로 노출할 포트이다.
        ports = ['8080']
        
        labels = [maintainer: "jungwoo <ijacsong98@gmail.com>"]
    }
}

 

Kotlin DSL로 작성하면 이렇게 된다.

// build.gradle.kts
plugins {
	...
    id("com.google.cloud.tools.jib") version "3.1.4"
    ...
}

jib {
    from {
        image = "adoptopenjdk/openjdk11"
    }
    to {
    	// image 이름
        // 여기서는 build.gradle에 설정되어 있는 project의 이름과 버전을 이용했다.
        // lowercase를 사용한 이유는 도커 이미지 이름에 대문자 사용이 불가능하기 때문이다.
        image = "${project.name}-${project.version.toString().toLowerCase()}"
        
        // image tag는 여러 개 적을 수 있다.
        tags = setOf("latest")
    }
    container {
        creationTime = "USE_CURRENT_TIMESTAMP"
        // JVM 옵션들
        // 서버 포트로는 8080을 사용했으며, profile로는 local을 선택했다.
        
        jvmFlags = listOf("-Dspring.profiles.active=local", "-XX:+UseContainerSupport", "-Dserver.port=8080", "-Dfile.encoding=UTF-8")
        
        // 컨테이너가 외부로 노출할 포트이다.
        ports = listOf("8080")
    }
}

 

1-1. (M1 Mac이라면) 해당 내용을 추가해준다.

jib {
	from {
    	...
        platforms {
        	platform {
            	architecture = "arm64"
                os = "linux"
            }
        }
	}
	...
}

 

전체적으로는 이런 형태가 될 것이다.

// build.gradle
jib {
    from {
        image = "adoptopenjdk/openjdk11"
        platforms {
        	platform {
            	architecture = "arm64"
                os = "linux"
            }
        }
    }
    to {
        image = "${project.name}-${project.version.toString().toLowerCase()}"
        tags = ["latest"]
    }
    container {
        creationTime = "USE_CURRENT_TIMESTAMP"
        jvmFlags = ['-Dspring.profiles.active=local', '-XX:+UseContainerSupport', '-Dserver.port=8080', '-Dfile.encoding=UTF-8']
        ports = ['8080']
        labels = [maintainer: "jungwoo <ijacsong98@gmail.com>"]
    }
}

 

해당 내용은 Jib 공식 문서를 보고 추가하였다.

jib/jib-gradle-plugin at master · GoogleContainerTools/jib

 

GitHub - GoogleContainerTools/jib: 🏗 Build container images for your Java applications.

🏗 Build container images for your Java applications. - GitHub - GoogleContainerTools/jib: 🏗 Build container images for your Java applications.

github.com

관련 옵션 두 가지

 

2. 빌드해본다!

// image 빌드
$ gradle jib

// Docker daemon을 이용해 빌드하기
$ gradle jibDockerBuild

 

결론

진짜 docker를 사용할 때 매번 힘들었던 게 Dockerfile 생성 및 빌드였는데,

빌드 프로세스를 엄청나게 간략화해줘서 편리했다.

앞으로도 Jib를 적극적으로 활용할 예정이다.

'Log.Develop > SpringBoot' 카테고리의 다른 글

@Transactional 파헤치기  (0) 2022.02.15
[Gradle] implementation vs compile  (4) 2020.02.25

관련글 더보기

댓글 영역