본문 바로가기

사이드프로젝트/(240808)이거왜오름?

이거왜오름?레포트캐시 스프링배치 도커라이징하고 스케줄링하기

일단 이거도 도커라이징부터 하자

도커라이징은 웹과 똑같은 도커파일을 사용하면된다

# 빌드 스테이지
FROM gradle:8.8-jdk17 AS build
COPY --chown=gradle:gradle . /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle build --no-daemon

# 실행 스테이지
FROM openjdk:17-slim

EXPOSE 8080

RUN mkdir /app

COPY --from=build /home/gradle/src/build/libs/*.jar /app/spring-boot-application.jar

ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/spring-boot-application.jar"]

 

도커이미지로 잘 말았으면,이걸 로컬저장소에 푸시하고,도커 컴포즈파일을 만들면 된다

version: '3'

services:
  batch-job:
    image: localhost:5000/whyprice_cache_batch:1.0
    container_name: batch-job-container
    restart: "no"
    env_file:
      - /env파일경로/main.env
    networks:
      - app-network


networks:
  app-network:
    external: true
    name: docker_app-network

 

이때 주의해야할건,restart를 no로 둬서,한번실행되고 꺼졌을때 재실행되는걸 방지하는것과,networks를 이미 존재하는 mysql의 네트워크에 결합시켜둬야한다는데 있다

그래서 networks에 external을 true로 줬고,docker network ls로,저번에 웹앱만들때 생성한 네트워크를 찾아서 저기에 name에 넣어서 둘을 연결시켜줘야한다

또한 env파일은 그때 사용했던 env파일 경로에 연결시켜두는게 편하다

 

일단 이렇게 만들어두고 docker-compose -f whyprice_batch_compose.yaml up -d 로 실행이 되는지를 확인해보자

컨테이너 로그확인은 docker logs batch-job-container 로 하면된다

 

잘 실행이 됐다면 이제 스케줄러에 등록해야한다

이건 그냥 리눅스의 크론탭에 시간마다 도커컴포즈를 실행하게 등록하면된다

 

일단 그러려면 시간마다 실행되는 쉘스크립트를 만들어야하는데,이건그냥

#!/bin/bash
docker-compose -f /home/rkrkrr0101/docker/batch/whyprice_batch_compose.yaml up --abort-on-container-exit

이렇게 도커컴포즈로 해당파일을 실행하라는 한줄만 넣으면된다(#!/bin/bash 는 꼭 넣어야함,쉘스크립트라는걸 알려주는거)

그리고 저걸 크론탭에 시간과같이 실행시키는 명령어를 넣으면 된다

crontab -e

이걸치면 에디터가 뜨는데,거기에 명령을 치고 wq를 해서 저장하면된다

명령으로

*/10 * * * * sh home/abcd/your-script.sh

를 치면 10분마다 저위치의 스크립트를 실행하라는거다(절대경로로 입력해두는게좋음)

 

이렇게 등록을 해두면되고,

크론탭 목록을 보고싶다면 crontab -l,삭제하고싶다면 crontab -r로 삭제할수있다

 

또한 로깅을 해야한다면

*/10 * * * * sh home/abcd/your-script.sh > /home/abcd/test.sh.log 2>&1

이렇게 실행마다 로그를 갱신할수있고,각 실행마다 다른로그파일을 만드려면

*/10 * * * * sh home/abcd/your-script.sh >> /home/abcd/test.sh.log 2>&1

이렇게하면 될거다,이건 직접 해보진않았으니 문제있으면 알려주셈

아마 모든 stderr을 파일로 저장할듯