본문 바로가기
DevOps/CICD

JIB을 이용한 컨테이너 배포

by yongckim 2022. 8. 2.
728x90
반응형

JIB 이란?

애플리케이션을 컨테이너화할 경우 보통 Dockerfile에 애플리케이션을 실행시킬 수 있는 내용을 정의하고 docker build를 통해 도커 이미지로 생성합니다.

자바 애플리케이션의 경우 애플리케이션을 빌드해서 jar 혹은 war 형태로 만든 후 Dockerfile을 작성해서 빌드된 결과물을 실행시키는 동작을 하도록 할 것입니다.

즉, 자바 빌드와 도커파일 빌드의 두번의 과정이 일어난다고 할 수 있습니다.

다음 그림의 첫번째는 자바 빌드와 도커파일 빌드를 두번하는 형태고 두번째는 Jib을 사용하는 빌드 흐름입니다.

위와 같이 Jib을 사용하면 프로젝트를 빌드함과 동시에 컨테이너 이미지까지 만들어서 원하는 레포에 푸시해 줄 수 있습니다.

./gradlew jib

Jib 설정하기

  1. 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 합니다.
반응형