반응형
2021/01/10 - [Docker] - 코드 push하면 hub.docker 자동 빌드하기 - github
hub.docker.com
source 코드의 형상관리를 github에서 한다면, 컨테이너의 형상관리는 hub.docker에서 한다고 볼 수 있습니다.
다양한 방법으로 hub.docker에 이미지를 관리할 수 있으며,
이번 글은 gradle script로 docker image 생성 및 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
DockerHub tag
DockerHub label
원래라면 아래와 같은 명령어와 commit, push 키워드를 사용하거나 이전 블로그처럼 github와 연동하는 방식이 필요한데요.
docker build . -t psawesome/genlog
빌드 스크립트의 경우 특정 행동 이후의 callback 실행도 가능하기 때문에 빌드할 때 배포 또한 자동화할 수 있는 측면이 있는 것 같습니다.
감사합니다!
반응형
'Java' 카테고리의 다른 글
실습으로 확인하는 tomcat server vs netty server (0) | 2022.07.12 |
---|---|
error rsocket run on mac os (1) | 2022.06.11 |
java isDigits, number parse exception 처리 (0) | 2020.05.11 |
Java 8 LocalDateTime convert date format: (0) | 2020.04.16 |
Java LocalDateTime으로 시간 체크 (0) | 2020.02.10 |