DEV/Container

[Docker] Spring Boot DockerFile.

l-eazzy 2024. 11. 16. 19:38

1. DockerFile

FROM gradle:8.5.0-jdk17 AS builder
WORKDIR /app

# 그래들 파일이 변경되었을 때만 새롭게 의존패키지 다운로드 받게함.
COPY build.gradle settings.gradle
RUN gradle build -x test --parallel --continue > /dev/null 2>&1 || true

# 빌더 이미지에서 애플리케이션 빌드
COPY . .
RUN gradle build -x test --parallel

# APP
FROM openjdk:17-jdk-slim
WORKDIR /app

# 빌더 이미지에서 jar 파일만 복사
COPY --from=builder /app/build/libs/*.jar app.jar

EXPOSE 80
# 프로필 환경변수 사용 시!
ENTRYPOINT ["java","-jar","-Dspring.profiles.active=${ACTIVE_PROFILE}","app.jar"]

 

첫번째 줄 builder stage 에서 각자 버전에 맞게 jdk 버전을 베이스로 할 것.

builder stage, application 실행 베이스를 다르게 두는 이유는 단순 코드 변경 시 gradle 을 재 빌드 할 필요가 없기 때문에 분리하여 변경 부분만 빌드가 실행된다.

 

 

2. docker-compose.yaml

# version: "3.8" 최신 버전에서는 버전 정보를 더이상 작성하지 않아도 된다.
services:
  backend:
    build: .
#      context: deploy/backend  # 별도의 디렉토리에서 관리한다면 사용 예시로 놔둠
#      dockerfile: ../Dockerfile
    ports:
      - 80:80
    environment:
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - ACTIVE_PROFILE=${ACTIVE_PROFILE}
    networks:
      - my-net
    # JPA EntityManager 생성 시 DB 연결을 바탕으로 하기 때문에
    # 설정해주거나 서비스 순서를 바꿔야한다.
    depends_on:
      - database

  database:
    image: postgres
    restart: always
    volumes:
      - my-volume:/var/lib/postgresql/data
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - my-net

    # 환경 변수
    environment:
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}

    expose: # 컨테이너 내부 네트워크 연결 포트 (Spring Boot - DB)
      - 5432
    ports:  # 외부 포트포워딩 (DB Admin Tool 데이터 확인 목적으로 사용 중)
      - 11001:5432

# 볼륨 설정
volumes:
  my-volume:

# 네트워크 설정
networks:
  my-net: # network-on, drive 설정등이 있지만 간단하게 기본 설정으로 진행

# 이름 지정
name: "project-name"

 

Spring Boot, Postgresql 세팅이다. 각 필요 부분을 변경해서 사용하면 된다.

 

단순 기록용이니 자세한 설명은 생략하겠다.

 

 

728x90