JIB 이란?
애플리케이션을 컨테이너화할 경우 보통 Dockerfile에 애플리케이션을 실행시킬 수 있는 내용을 정의하고 docker build를 통해 도커 이미지로 생성합니다.
자바 애플리케이션의 경우 애플리케이션을 빌드해서 jar 혹은 war 형태로 만든 후 Dockerfile을 작성해서 빌드된 결과물을 실행시키는 동작을 하도록 할 것입니다.
즉, 자바 빌드와 도커파일 빌드의 두번의 과정이 일어난다고 할 수 있습니다.
다음 그림의 첫번째는 자바 빌드와 도커파일 빌드를 두번하는 형태고 두번째는 Jib을 사용하는 빌드 흐름입니다.

위와 같이 Jib을 사용하면 프로젝트를 빌드함과 동시에 컨테이너 이미지까지 만들어서 원하는 레포에 푸시해 줄 수 있습니다.
./gradlew jib
Jib 설정하기
- jib을 사용하기 위해 다음과 같이 jib 의존성을 추가해줍니다.
plugins {
...
id 'com.google.cloud.tools.jib' version '3.2.1'
...
}
2. jib을 사용하여 컨테이너 이미지 도커 파일로 빌드하는 과정을 자동화하기 위해서 다음 명령어를 입력합니다.
jib {
from {
image = "amazoncorretto:17.0.4-al2"
platforms {
platform {
architecture = "arm64"
os = "linux"
}
}
}
to {
image = "{도커허브 아이디}/${project.name}"
tags = ["${project.version.toString().toLowerCase()}"]
}
container {
jvmFlags = ['-XX:+UseContainerSupport', '-Xms512m', '-Xdebug']
}
}
jib으로 컨테이너 빌드를 자동화할때 중요한 역할을 하는 3가지 구문을 알아봅시다
- from
from {
image = "amazoncorretto:17.0.4-al2"
platforms {
platform {
architecture = "arm64"
os = "linux"
}
}
}
from은 컨테이너의 이미지를 넣고 플랫폼 정보(intel인지, m1인지 같은)를 넣을때 사용되는 구문입니다.
위의 from구문에서 사용되는 키워드들은 다음과 같습니다.
- image → 베이스로 할 컨테이너 이미지를 지정합니다. 위에서는 java 17을 사용하기 때문에 amazoncorretto jdk 17을 사용했습니다.
- platforms → 해당 이미지가 어떤 플랫폼으로 돌아가는지 지정합니다.
- archtecture → 어떤 아키텍처인지 지정합니다.
- os → 실행되는 OS를 지정합니다.
to
to {
image = "{도커허브 아이디}/${project.name}"
tags = ["${project.version.toString().toLowerCase()}"]
}
to의 주요 역할로는 image의 이름과 tag를 지정할 수 있습니다. 이를 통해 컨테이너 빌드를 완료한 이미지를 자기가 원하는 형태로 관리할 수 있습니다.
- image → 생성된 컨테이너 이미지의 이름을 지정합니다.
- tag → 생성된 컨테이너의 태그를 지정합니다.
container
container {
jvmFlags = ['-Xms512m']
}
contrainer는 이미지가 컨테이너화 되어 실행될 때 필요한 자바 애플리케이션의 실행을 지정할 수 있습니다.
- -Xms512m → java 애플리케이션의 최대 힙 사이즈를 512 MB로 제한합니다.
3. 우리는 파일을 도커 허브에 컨테이너 이미지를 올릴 것이므로 docker login 명령을 통해 dockerhub의 ID, Password를 입력해줍니다.
docker login
4. ./gradlew jib을 통해 빌드와 동시에 컨테이너로 빌드를 시켜줍니다.
./gradlew jib
5. 도커허브에서 확인해보면 해당 파일이 잘 올라간 것을 확인할 수 있습니다.

github actions에서 단순빌드가 아닌 jib으로 처리하는 과정 추가
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
- name: Cache Gradle packages
uses: actions/cache@v3
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
restore-keys: ${{ runner.os }}-gradle
- name: Log in to Docker Hub
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Execute Gradle build and analyze
run: ./gradlew jib
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
- Log in to Docker Hub
- username → Dockerhub id를 전달하면 됩니다.
- password → Dockerhub password를 전달하면 됩니다.
- Execute Gradle build and analyze
- jib → gradle에 추가한 jib을 통해 build하고 도커 이미지를 생성하고 도커허브에 push 합니다.
'DevOps > CICD' 카테고리의 다른 글
무중단 배포 적용하기 (2) | 2022.08.24 |
---|---|
Github actions + Jenkins를 통한 자동 배포 구현 (0) | 2022.08.14 |
sonarQube를 이용한 CI 코드 정적 분석 기능 추가 (0) | 2022.07.30 |
Github actions에서 jacoco를 통해 테스트 커버리지 확인하기 (0) | 2022.07.29 |