Page tree
Skip to end of metadata
Go to start of metadata



Jib이란?

an open-source Java containerizer from Google that lets Java developers build containers using the Java tools they know.

Jib is a fast and simple container image builder that handles all the steps of packaging your application into a container image.
It does not require you to write a Dockerfile or have docker installed, and it is directly integrated into Maven and Gradle—just add the plugin to your build and you'll have your Java application containerized in no time.


공식 포스트에서 Jib을 이렇게 소개하고 있다.

한마디로 자바개발자를 위해서 나온 빠르고 간단한 도커 컨테이너 이미지 빌더.


Docker Build VS Jib Build Flow


어떻게 개선하는가?

  1. Simple
    1. Java로 구현되며 Maven 또는 Gradle 빌드의 일부로 실행됨.
    2. Dockerfile을 유지 관리하거나 Docker 데몬을 실행하거나 모든 디펜던시를 포함하는 Jar를 생성하는 것에 대해 걱정할 필요가 없음.
  2. Fast
    1. image layering과 registry caching을 활용하여 빠르고 점진적인 빌드를 수행.
    2. 빌드 구성을 읽고 응용 프로그램을 별도의 계층(종속성, 리소스, 클래스)으로 구성하고 변경된 계층만 다시 작성하고 푸시함.
      1. 같이 읽어보면 이해하기 쉬움 : https://medium.com/@gaemi/spring-boot-%EA%B3%BC-docker-with-jib-657d32a6b1f0
  3. Reproducible 
    1. Maven 및 Gradle 빌드 메타 데이터에서 선언적으로 컨테이너 이미지 빌드를 지원하므로 입력이 동일하게 유지되는 한 재현 가능한 빌드 이미지를 생성하도록 구성 할 수 있음.



Jib 적용방법 (with Gradle, Spring boot 2)

  • 플러그인만 등록해주면 사용가능. 아무 세팅 하지 않으면 생성되는 이미지의 이름은 module 이름과 version 태그로 빌드 됨.

    build.gradle
    plugins {
        ...
        id 'com.google.cloud.tools.jib' version '2.3.0'
    }


Jib 기본 사용 예제


  • Docker 없이 registry에 이미지 저장 ( 아이디와 비번 노출을 방지하기 위해 https://github.com/docker/docker-credential-helpers 참고할 것 )

    ./gradlew jib
  • Docker deamon를 이용하여 로컬에 이미지 저장 ( 우리는 편하고 통일성 있는 local 개발을 위해 jibDockerBuild를 사용 )

    ./gradlew jibDockerBuild


Jib 고급 사용 예제


  • Configuration

    build.gradle
    jib {
      from {
        image = 'openjdk:alpine'
      }
      to {
        image = 'localhost:5000/my-image/built-with-jib'
        credHelper = 'osxkeychain'
        tags = ['tag2', 'latest']
      }
      container {
        jvmFlags = ['-Xms512m', '-Xdebug', '-Xmy:flag=jib-rules']
        mainClass = 'mypackage.MyApp'
        args = ['some', 'args']
        ports = ['1000', '2000-2003/udp']
        labels = [key1:'value1', key2:'value2']
        format = 'OCI'
      }
    }
    
  • Run `jib` with each build

    build.gradle
    tasks.build.dependsOn tasks.jib
    

함께 보기


  • No labels