Java

gradle docker image 생성하기: spring boot

PSAwesome 2021. 1. 25. 02:59
반응형

2021/01/10 - [Docker] - 코드 push하면 hub.docker 자동 빌드하기 - github

 

코드 push하면 hub.docker 자동 빌드하기 - github

안녕하세요. github에서 push하면 docker hub에서 이미지 자동으로 빌드하게 만드는 글입니다. 자동으로 이미지 빌드하면 뭐가 좋은가? 도커 환경일 경우에 좋습니다! 적어도 한 사이클마다 작업이 줄

psawesome.tistory.com

 

hub.docker.com

source 코드의 형상관리를 github에서 한다면, 컨테이너의 형상관리는 hub.docker에서 한다고 볼 수 있습니다.

 

다양한 방법으로 hub.docker에 이미지를 관리할 수 있으며,

이번 글은 gradle script로 docker image 생성 및 push하는 내용의 글입니다.

 

흐름

gradle 스크립트로 push까지의 과정

 

1. source code

package org.psawesome.filebeatforkafka;

import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import reactor.core.publisher.Flux;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

@Slf4j
@SpringBootApplication
public class FilebeatForKafkaApplication {

  public static void main(String[] args) {
    SpringApplication.run(FilebeatForKafkaApplication.class, args);
  }

  @Bean
  CommandLineRunner runner() {
    return args -> {
      Flux.generate(sink -> sink.next(new StockInfo()))
              .delayElements(Duration.ofMillis(333))
              .index()
              .log()
              .subscribe();
      log.info("Hello ps world!!!");
    };
  }

}

매우 간단한 spring boot hello world 코드입니다.

 

@ToString
@EqualsAndHashCode
@Getter(AccessLevel.PACKAGE)
class StockInfo {

  private final String title;
  private final int price;
  private final LocalDateTime dateTime;

  public StockInfo() {
    this.title = defaultTitle();
    this.price = defaultPrice();
    this.dateTime = LocalDateTime.now();
  }

  private String defaultTitle() {
    var titleList = List.of("삼성전자", "현대모비스", "키움증권", "신세계", "삼성SDI");
    return titleList.get(ThreadLocalRandom.current().nextInt(titleList.size() - 1));
  }

  private int defaultPrice() {
    return ThreadLocalRandom.current().nextInt(-300_000, 300_000);
  }
}
  • -30만~30만 까지의 금액 및 title을 조합하는 클래스입니다.

 

2. Dockerfile

FROM hirokimatsumoto/alpine-openjdk-11

MAINTAINER PS

VOLUME /var/log/
EXPOSE 8090

# --build-arg build/libs/\*.jar
ARG JAR_FILE
#ARG APP=app.jar
COPY ${JAR_FILE} app.jar

#"-Djava.security.egd=file:/dev/./urandom",
#"-Dspring.profiles.active=prod",
ENTRYPOINT ["java", "-jar", "/app.jar"]
  • jar 파일의 copy와 jar 실행 명령어(ENTRYPOINT)가 작성된 Dockerfile

 

3. build.gradle

 

plugin

plugins {
    id 'org.springframework.boot' version '2.4.1'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java' id 'com.palantir.docker' version '0.22.1'
}
  • docker plugin 추가

 

extension

ext {
    BUILD_VERSION = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm_ss"))
}
  • 날짜를 이미지 태그에 추가하기 위한 extension

 

docker task

docker {
    name 'psawesome/genlog'
    tag 'Dockerhub', "psawesome/genlog:${project.version}_${BUILD_VERSION}"
    dockerfile file('Dockerfile')
    files tasks.bootJar.outputs.files
    buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singleFile.name])
    labels(['key': 'value'])
    pull true
    noCache true
}
  • name: 이미지 repository/name
  • tag: 이미지 뒤에 붙일 tag
  • dockerfile: 파일 이름
  • files: 컨테이너에 탑재될 file
  • buildArgs: 파라미터로 전달할 내용

 

gradle build -> docker push DockerHub

plugin 추가한 gradle on idea

 

DockerHub tag

tag를 추가한 형태

 

DockerHub label

labels 추가 형태

 

 

원래라면 아래와 같은 명령어와 commit, push 키워드를 사용하거나 이전 블로그처럼 github와 연동하는 방식이 필요한데요.

docker build . -t psawesome/genlog

 

빌드 스크립트의 경우 특정 행동 이후의 callback 실행도 가능하기 때문에 빌드할 때 배포 또한 자동화할 수 있는 측면이 있는 것 같습니다.

 

감사합니다!

반응형