M1 Mac에서 Jib를 이용하여 스프링 부트 프로젝트를 빌드하는 것에는 성공했으나, 실행할 때 알 수 없는 이유로 실패했다.
(정확하게는 configuration 관련 빈들을 생성할 때 meta-data를 읽지 못해 생기는 이슈인 것으로 파악했다.)
(오류명: Unable to read meta-data..)
이 기회에 Jib에 대해서 좀 더 알아보고 정리한 다음,
M1 Mac에서 어떻게 하면 Jib 이미지를 정상적으로 빌드할 수 있는지에 대해서 소개하고자 한다.
또한 Kotlin DSL로 작성한 내용도 추가하였다.
Jib는 Dockerfile을 사용하지 않거나 Docker를 설치할 필요 없이 컨테이너를 빌드할 수 있도록 도와주는 도구이다.
특히 자바 컨테이너를 빌드하는 데 사용하는 도구이며, Maven과 Gradle 용 플러그인을 이용해 사용할 수도 있고 Jib 자바 라이브러리를 통해 사용할 수도 있다.
프로젝트에서 Jib를 이용하면 Docker Image를 뚝-딱 만들 수 있는 것이다.
그러니깐, Github action 등에서 이미지 빌드를 할 때 Docker Daemon이 필요 없다는 이야기다!
또한 빌드할 때 변경 사항만 이미지에 반영하기 때문에 매우 빠르다고 한다.
참고로 아래의 Jib 관련 내용 작성 환경은 다음과 같다.
// 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")
}
}
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
// image 빌드
$ gradle jib
// Docker daemon을 이용해 빌드하기
$ gradle jibDockerBuild
진짜 docker를 사용할 때 매번 힘들었던 게 Dockerfile 생성 및 빌드였는데,
빌드 프로세스를 엄청나게 간략화해줘서 편리했다.
앞으로도 Jib를 적극적으로 활용할 예정이다.
@Transactional 파헤치기 (0) | 2022.02.15 |
---|---|
[Gradle] implementation vs compile (4) | 2020.02.25 |
댓글 영역