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