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

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: Cache SonarCloud packages uses: actions/cache@v3 with: path: ~/.sonar/cache key: ${{ runner.os }}-sonar restore-keys: ${{ runner.os }}-sonar - 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 test sonarqube 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 합니다.