코드 저장소.

Jib을 활용한 Docker 이미지 자동화 빌드 경험기 본문

포폴/일정관리앱

Jib을 활용한 Docker 이미지 자동화 빌드 경험기

slown 2025. 5. 27. 23:33

목차

1.Jib이란 무엇인가?

2.왜 도입을 했는가?

3.프로젝트에 적용

4.후기

 

1.Jib이란 무엇인가?

Jib 공식 문서

Jib은 구글에서 만든 Java 컨테이너 이미지 빌더다. 간단히 말하면 Dockerfile없이 Gradle이나 Maven 플러그인만으로 Spring Boot프로젝트를 쉽고 빠르게 Docker이미지를 만들 수 있다.

 

기존 방식

 

기존의 DockerFile을 사용한 경우

  • 기존의 DockerFile의 경우에는 빌드 → jar 생성 → Dockerfile 작성 → docker build/push 순으로 진행합니다.
  • 하지만 이러한 방식은 이미 패키징된 jar 파일을 이미지화 시켰기 때문에 약간의 소스 수정이 일어나더라도 변경된 소스로 인해 dependency들이 포함된 jar 파일 전체가 새로운 이미지로 인식 되어 전체 파일 빌드를 다시 수행하기 때문에 Docker layer의 장점을 살릴 수 없습니다.

하지만 Jib을 쓰면

  • Gradle 명령어 한 줄로 이미지 빌드 & 푸시까지 한번에 해결합니다.
  • CI/CD와 궁합이 좋습니다.

2.왜 도입을 했는가?

현재 내 상황:

  • Github Actions을 사용해서 CI/CD 를 구축해야되는 상황. 
  • 개발-운영 환경에 따라 도커 이미지 빌드/배포 자동화가 필요함.
  • Dockerfile 없이 관리하고 싶음(단일 진입점)

적용 목표

  • 빌드와 동시에 도커 이미지화
  • 도커허브에 바로 push
  • 서버에서는 pull만 해서 바로 띄우는 구조

3.프로젝트에 적용

1) build.gradle 플러그인 설정

plugins {
    id 'com.google.cloud.tools.jib' version '3.4.0'
}

jib {
    to {
        image = 'well4149/schedule-management:latest'
        auth {
            username = '도커허브계정'
            password = '도커허브토큰'
        }
    }
    container {
        ports = ['8080']
        environment = [
            'SPRING_PROFILES_ACTIVE': 'local'
        ]
    }
}

 

2) Jib으로 이미지 빌드 & 푸시

./gradlew jib

 

3) docker-compose.yaml 작성

version: '3.8'
services:
  backend:
    image: well4149/schedule-management:latest
    ports:
      - "8082:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=local
      - SPRING_KAFKA_BOOTSTRAP_SERVERS=kafka:9092
      - SPRING_DATA_REDIS_HOST=redis
      - SPRING_DATASOURCE_URL=jdbc:mysql://host.docker.internal:3306/schedule?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=root
    depends_on:
      - kafka
      - redis
    networks:
      - backend-net
  # ... 이하 kafka/redis 등

 

4) 문제와 해결

 

  • application-local.yml, 설정 클래스 등에서 하드코딩된 값이 환경변수를 덮어씀
  • ${...:default} 문법을 사용해 환경변수 우선 적용
  • Bean 설정, ConsumerConfig, ProducerConfig에도 동일 적용 필요
spring:
  kafka:
    bootstrap-servers: ${SPRING_KAFKA_BOOTSTRAP_SERVERS:localhost:9092}

 

5) 디버깅 명령어

# 환경 변수 확인
docker exec -it schedule-backend sh
env | grep SPRING

# 컨테이너 내부에서 yml 확인
cat /app/resources/application-local.yml

# 포트 바인딩 확인
netstat -nlp

# API 동작 확인
curl http://localhost:8082/actuator/health

4.후기

 환경 변수 및 Bean 설정의 일관성 중요성

  • Spring 설정(application.yml, Java Config, Bean 등)에 하드코딩된 값이 존재할 경우, Docker 컨테이너 내 환경 변수 오버라이딩이 제대로 동작하지 않아 예기치 않은 오류가 발생했습니다.
  • 설정 계층 전체에서 환경 변수 기반의 유연한 설정 구조를 유지하는 것이 컨테이너화에 있어 필수적임을 체감했습니다.

 브랜치 및 빌드 관리의 중요성

  • CI 환경에서 올바른 브랜치 기반의 빌드가 이루어지지 않을 경우, 구버전 코드가 배포되는 등 운영 환경과 개발 환경 간의 불일치 문제가 발생할 수 있다는 점을 알았습니다.
  • 이를 통해 빌드 및 배포 자동화 파이프라인의 신뢰성 확보를 위한 Git 브랜치 관리 체계의 중요성을 실감했습니다.