Gradle Jib 플러그인 - Gradle으로 Docker 컨테이너 이미지 빌더

Jib란?

Jib은 Dockerfile을 사용하거나 Docker 설치 없이 Java 어플리케이션 컨테이너를 빌드할 수 있게 해주는 Google의 오픈 소스 Java 컨테이너라이저이다.
Jib는 애플리케이션을 컨테이너 이미지로 패키징하는 모든 단계를 빠르게 처리하는 컨테이너 이미지 빌더이다.
Dockerfile을 작성하거나 도커를 설치할 필요가 없으며 Maven 및 Gradle의 플러그인으로 동작하며, 플러그인을 설치한 다음 타깃 이미지에 대한 설정과 빌드에 대한 정의만 하면 Java 애플리케이션을 즉시 컨테이너화 할 수 있다.

  • Docker build flow Docker build flow

  • Jib 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에서 설정할 수 있는 가장 중요한 항목은 imagetags 이다.
    • 여기에서의 imagefrom 과는 반대로 생성된 컨테이너 이미지가 저장될 레포지터리를 의미한다. 그리고 tags는 이 이미지에 설정될 태그를 의미한다.
  • container
    • container 구문은 컨테이너 이미지가 컨테니어화 되어서 실행될 때 필요한 자바 애플리케이션의 jvmFlags, environment 설정들을 지정할 수 있다.

위 내용들을 토대로 아래와 같이 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" 이 두 가지 옵션을 넣었다.

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에 들어가면 보면 생성된 이미지가 등록되어 있는걸 확인 할 수 있다.

Jib Dockerhub

참조




최종 수정 : 2024-01-18