spring + kotlin + gradle 환경에서 Jib docker 적용

jaycee·2023년 11월 14일
0
post-thumbnail

goals

  1. gradle + kotlin 프로젝트를 도커라이징 한다.
  2. 도커라이징 배포 환경에 맞게 구성한다.
    * cicd는 나중에 구성하기로 한다.

Jib이란?

Jib 소개

https://cloud.google.com/java/getting-started/jib?hl=ko

Jib는 구글에서 만든 컨테이너 이미지 빌드 작업을 간편화 시킨 툴이다.

위 Jib 문서에서는 GCP를 이용한 방법이 소개되어있는데, AWS에서도 사용가능하고 이번 태스크에서는 AWS를 이용한 방법을 적용한다.

before Jib

before jib
기존 jib 없이 도커라이징하여 푸시를 하기 위해서는 아래와 같은 절차와 환경을 구성을 하고 작업을 수행해야 한다.

  1. 개발자 또는 배포 환경에 docker를 설치한다.
  2. 프로젝트 루트에 Dockerfile을 생성한다.
  3. 프로젝트를 빌드 후 도커 서비스로 jar와 Docker파일을 읽어 이미지를 빌드한다.
  4. 이미지를 외부 리포지토리에 푸시한다.

텍스트로 보면 당연히 해야하고 단순해 보이는 작업이지만, 각 단계별로 세팅하고 확인해야할 것도 많아진다. 신규 입사자나 devops가 이슈 트래킹을 위해 빌드 절차를 확인해본다고 생각해보면 위 과정을 하나하나 확인해야한다.

after Jib

after jib

Jib를 이용하면 docker 어플리케이션과 Dockerfile없이 docker image를 생성하고 외부 리포지토리에 푸시도 할 수 있다.

결과적으로 아래와 같이 간편하게 구성할 수 있다.

  1. 빌드 도구에 jib 플러그인을 추가한다.
  2. 프로젝트 빌드 후 이미지를 빌드한다. 이후 jip이 빌드된 이미지를 자동으로 푸시시켜준다.

이외에도 구글 Jib을 사용하면 빌드가 빠르고 레이어별 구성을 할 수 있다.

Jib 세팅

기반 환경

gradle 8.2.1
java 17
kotrlin 1.8
spring boot 2.7.X
intelliJ
mac OS arm64

1. Jib 플러그인 세팅

build.gradle.kts에 플러그인을 추가한다.

plugins {
    id("org.springframework.boot") version "2.7.13"
...
...
    id("com.google.cloud.tools.jib") version "3.4.0"
}

플러그인 추가 후 프로젝트를 새로고침하면 gradle에 Jib 의존성이 추가된다.

2. Jib 스크립트 구성

build.gradle.kts에 jib 스크립트를 추가한다.

jib {

    from {
        image = "amazoncorretto:17"
    }

    to {
        val versionDetails: groovy.lang.Closure<com.palantir.gradle.gitversion.VersionDetails> by extra
        val details = versionDetails()
        val tag: String = project.findProperty("tag") as? String ?: details.gitHash //도커 이미지에 git commit hash를 박아넣는다.

        image = "1*****0.dkr.ecr.ap-northeast-2.amazonaws.com/my-application"
        tags = setOf("latest", tag)
    }

    container {
        creationTime = "USE_CURRENT_TIMESTAMP" //이걸 넣어야 빌드시간이 제대로 찍힘

        jvmFlags =
            listOf(
                "-XX:+UseContainerSupport",
                "-Dserver.port=8080",
                "-Dfile.encoding=UTF-8",
                "-XshowSettings:vm",
                "-XX:MinRAMPercentage=50.0",
                "-XX:MaxRAMPercentage=80.0",
            )

        ports = listOf("8080")
    }
}

3. 빌드 수행

🏗️ UI에서 빌드하는 방법

jibDockerBuild를 더블 클릭하여 빌드 실행

🏗️ CLI에서 빌드하는 방법

jibDockerBuild는 이미지 빌드만 하고 이미지 push를 하지는 않는다. 이미지 푸시를 하려면 ./gradlew jib 명령어를 실행한다. 이미지 리포지토리 구성이 안된 로컬이나 테스트 환경에서는 jibDockerBuild를 이용해서 일단 빌드가 잘되는지를 확인할 수 있다.

./gradlew clean jibDockerBuild

💡 빌드 시 파라미터를 주입시키려면 -Penv=dev 형태의 파라미터를 빌드 명령어 뒤에 붙여주고 빌드 스크립트에서 이 파라미터를 받아서 사용하면 된다.

🏗️ github Action pipeline에서 빌드하는 방법

gradlew jib 명령어를 사용하면 이미지 리포지토리에 푸시까지 수행한다. 그러므로 credential을 취득해야한다.

./gradlew clean jib -x test -Penv=${{ steps.expect-environment.outputs.APPLICATION_ENV }}

4. 실행 방법

생성한 이미지는 아래 커맨드로 확인 및 실행이 가능하다.

docker images

docker run 0***0.dkr.ecr.ap-northeast-2.amazonaws.com/my-application:latest
profile
오늘도 하나 배웠다.

0개의 댓글