Gradle Jib 플러그인 - Gradle으로 Docker 컨테이너 이미지 빌더
Jib란?
Jib은 Dockerfile을 사용하거나 Docker 설치 없이 Java 어플리케이션 컨테이너를 빌드할 수 있게 해주는 Google의 오픈 소스 Java 컨테이너라이저이다.
Jib는 애플리케이션을 컨테이너 이미지로 패키징하는 모든 단계를 빠르게 처리하는 컨테이너 이미지 빌더이다.
Dockerfile을 작성하거나 도커를 설치할 필요가 없으며 Maven 및 Gradle의 플러그인으로 동작하며, 플러그인을 설치한 다음 타깃 이미지에 대한 설정과 빌드에 대한 정의만 하면 Java 애플리케이션을 즉시 컨테이너화 할 수 있다.
-
Docker build flow
-
Jib build flow
Jib 설정 및 실행방법
jib을 사용하기 위해서는 build.gradle
관련 라이브러리를 추가하고 컨테이너 이미지 설정을 해야한다.
사전 준비
- Java 개발 환경이 필요 하다.
- Docker Hub 계정이 필요하다.
- 없다면 가입을 하길 바란다.
jib 예제 프로그램 생성
먼저 프로젝트를 생성한다.
curl https://start.spring.io/starter.tgz \
-d bootVersion=2.7.5 \
-d dependencies=web \
-d baseDir=spring-gradle-jib \
-d groupId=com.devkuma \
-d artifactId=devkuma-gradle-jib \
-d packageName=com.devkuma.hello \
-d applicationName=HelloApplication \
-d packaging=jar \
-d javaVersion=17 \
-d type=gradle-project | tar -xzvf -
아래와 같이 간단한 어플리케이션을 만든다.
package com.devkuma.hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
@RequestMapping("/")
public String hello() {
return "hello";
}
}
위에서 생성된 프로젝트는 GitHub에 활용하길 바란다.
jib 라이브러리 추가
build.gradle
빌드 파일에서 플러그인에 jib 라이브러리 추가한다.
plugins {
//... 중간 생략 ...
id 'com.google.cloud.tools.jib' version '3.2.0'
}
jib 설정 추가
build.gradle
파일에 jib 설정 추가한다.
jib 설정 항목은 아래와 같다.
from
from
에서 설정할 수 있는 가장 중요한 항목은image
이다.- jib 라이브러리가 애플리케이션을 컨테이너 이미지로 만들 때 사용하는 베이스 이미지를 지정하는 항목이다
- 아무것도 설정하지 않으면
adoptopenjdk:11-jre
이 기본값이 된다.
to
to
에서 설정할 수 있는 가장 중요한 항목은image
와tags
이다.- 여기에서의
image
는from
과는 반대로 생성된 컨테이너 이미지가 저장될 레포지터리를 의미한다. 그리고tag
s는 이 이미지에 설정될 태그를 의미한다.
container
- container 구문은 컨테이너 이미지가 컨테니어화 되어서 실행될 때 필요한 자바 애플리케이션의
jvmFlags
,environment
설정들을 지정할 수 있다.
- container 구문은 컨테이너 이미지가 컨테니어화 되어서 실행될 때 필요한 자바 애플리케이션의
위 내용들을 토대로 아래와 같이 jib 설정정보를 생성한다.
jib {
from {
image = "adoptopenjdk/latest"
}
to {
image = "devkuma/hello-jib"
tags = ["latest"]
auth {
username = 'devkuma'
password = "xxxx"
}
}
container {
jvmFlags = ["-Xms128m", "-Xmx128m"]
}
}
- from
adoptopenjdk/latest
이미지를 베이스 이미지로 하여 컨테이너 이미지를 만든다.
- to
- 도커 허브의
devkuma/hello-jib
저장소에latest
라는 태그를 넣어서 푸시하고 컨테이너화가 한다. auth
에 docker hub에 계정 정보를 넣었다. (여기에는 본인 계정 정보를 넣으면 된다.)
- 도커 허브의
- container
- 동작할 때는 JVM 옵션(
jvmFlags
)으로"-Xms128m"
,"-Xmx128m"
이 두 가지 옵션을 넣었다.
- 동작할 때는 JVM 옵션(
jib 이미지 생성 확인
아래 jib 이미지 생성 명령어로 이미지 생성한다.
$ ./gradlew jib
아래는 실제 생성 명령어를 실행시킨 내용이다.
% ./gradlew jib
Starting a Gradle Daemon, 1 busy and 3 stopped Daemons could not be reused, use --status for details
> Task :jib
Containerizing application to devkuma/gradle-jib, devkuma/gradle-jib...
Base image 'adoptopenjdk' does not use a specific image digest - build may not be reproducible
Using credentials from to.auth for devkuma/gradle-jib
The base image requires auth. Trying again for adoptopenjdk...
Using base image with digest: sha256:3f2982d13b40d8c6d56a3a736c4f6c51a3c99688c2b434a27ed5d1b5f3fbedfb
Container entrypoint set to [java, -Xms128m, -Xmx128m, -cp, @/app/jib-classpath-file, com.devkuma.hello.HelloApplication]
Built and pushed image as devkuma/gradle-jib, devkuma/gradle-jib
Executing tasks:
[==============================] 100.0% complete
BUILD SUCCESSFUL in 58s
3 actionable tasks: 1 executed, 2 up-to-date
user@AD02291831 spring-gradle-jib %
jib 이미지 생성 및 등록 확인
실제 Dockerhub에 들어가면 보면 생성된 이미지가 등록되어 있는걸 확인 할 수 있다.
참조
- Introducing Jib — build Java Docker images better | Google Cloud Platform Blog
- Jib로 자바 컨테이너 빌드 | Google Cloud
- 위에 모든 소스 코드는 GitHub에서 확인해 볼 수 있다.
최종 수정 : 2024-01-18