[4] Spring Boot 에서 gradle task 설정하기

hyyyynjn·2021년 2월 22일
0
post-thumbnail
  • spring boot application 코드를 github에 올리면, jenkins가 이를 clone하여 빌드한다.
    • build시 수행해야 하는 작업을 위해서 build.gradle에 task를 설정한다.
    • 참조문헌

Dockerfile 만들기

  • build.gradle가 있는 경로에 Dockerfile을 만든다
FROM lpicanco/java11-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • FROM lpicanco/java11-alpine
    • alpine이라는 가벼운 버전의 리눅스에 java11이 설치된 docker image를 기반으로 image를 만든다는 것이다.
  • ARG JAR_FILE
    COPY ${JAR_FILE} app.jar
    • 인자로 스프링부트 jar파일을 받아 app.jar라는 이름의 파일로 copy한다는 의미이다.
  • ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
    • 참고
    • 도커 컨테이너가 실행되었을 때 ENTRYPOINT에 기입된 옵션들로 이뤄진 명령을 실행한다.
    • ENTRYPOINT ["<실행 파일>", "<매개 변수1>", "<매개 변수2>"] 형식
      • 여기서는 /app.jar 파일을 실행한다는 것 같다.

build.gradle 파일

gradle로 docker image 빌드하기

  • jar파일을 docker 이미지로 만들기 위해서 필요한 플러그인 설치
group 'org.example'
version '1.0-SNAPSHOT'

plugins {
    // jenkins 에서 ./gradlew docker 혹은 dockerRun 이라는 task 를 실행하기위해 필요한 플러그인들
    id 'com.palantir.docker' version '0.25.0'
}
  • gradle 플러그인 'com.palantir.docker'에서 필요한 configuration을 작성한다.
    • docker {...}이 없다면 빌드 테스트 오류발생
// id 'com.palantir.docker' 플러그인을 추가하면 반드시 docker{}를 명시해줘야 빌드테스트 오류가 나지 않는다.
docker {
    println("gradle docker-plugin start = spring-example:${project.version}")
    name "spring-example:${project.version}"
    files tasks.bootJar.outputs.files
    tag 'DockerHub', "guswns3371/spring-example:${project.version}"
    buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singleFile.name])
}
  • name "spring-example:${project.version}"
    • 해당 프로젝트로 만든 도커 이미지의 name을 "spring-example:1.0-SNAPSHOT"으로 설정한다.
    • 도커에서 repository 이름이 반드시 소문자여야 하므로 spring-example로 설정한다.
  • files tasks.bootJar.outputs.files
    • Dockerfile에서 사용할 수 있는 파일을 명시해준다.
    • 'com.palantir.docker' 플러그인은 이 파일을 임시경로에 저장한뒤, docker build 명령에서 사용될 파일로 해당 파일만 노출시킨다.
  • 'com.palantir.docker' 플러그인에 대한 configuration의 내용을 실행한다.
    • "spring-example:1.0-SNAPSHOT"이라는 이름의 도커 이미지가 생성된다.
  • docker 설치 후 /var/run/docker.sock의 permission denied 발생하는 경우
    • docker가 설치된 환경에서 "sudo chmod 666 /var/run/docker.sock" 명령어를 실행해줘야 한다.
./gradlew docker
  • "spring-example:1.0-SNAPSHOT" 라는 이름의 도커 이미지가 생성된다.

application.yaml 설정하기

  • 스프링 부트 어플리케이션의 resource 경로에 yaml파일을 만든다.
server:
  port: 80

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://db:3306/spring_example?serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true&useSSL=false&characterEncoding=UTF-8
    username: root
    password: password123

  jpa:
    properties:
      hibernate:
        ddl-auto: update
        show-sql: true
        format-sql: true
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
    generate-ddl: true
    open-in-view: false
  session:
    store-type: jdbc
  • server:
    port: 80

    • 스프링 부트 기본 포트 8080 이 아닌 80으로 설정한다.
  • driver-class-name: com.mysql.cj.jdbc.Driver

    • 해당 드라이버를 사용하기 위해서 build.gradle 파일에 코드를 추가한다
    dependencies {
      implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.15'
    		}
  • url: jdbc:mysql://db:3306/spring_example?serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true&useSSL=false&characterEncoding=UTF-8

    • db:3306 : db라는 docker container에 3306포트로 연결한다.
      • docker run -d --name db -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 --network docker-network mysql
      • 으로 mysql 이미지를 db 라는 이름의 컨테이너로 실행했기 때문이다.
      • db라는 이름을 사용할 수 있는 이유는
        • db와 spring_example_app 컨테이너가 docker-network라는 네트워크에 묶여있기 때문이다.
    • spring_example : db 컨테이너에서 만든 데이터베이스이다. 참조
  • username: root
    password: password123

    • db 컨테이너의 사용자 root와 비밀번호 password123을 입력한다.

0개의 댓글