카테고리 없음
[Spring] 최종: Docker 컨테이너화 및 CI/CD 파이프라인 구축
초코chip
2024. 11. 12. 09:06
운영 환경을 위한 도커 파일 작성(Dockerfile)
- 빌드 단계: 빌드 파일 생성 (.jar)
- 실행 단계: 빌드 파일 실행
./Dockerfile
# 1단계: 빌드 단계
FROM gradle:8.3-jdk17 AS builder
# 작업 디렉토리 설정
WORKDIR /app
# Gradle 캐시를 활용하기 위해 필요한 파일만 먼저 복사
COPY build.gradle settings.gradle ./
COPY gradle gradle
# 의존성 미리 다운로드 (테스트 제외)
RUN gradle build --no-daemon -x test || return 0
# 전체 소스 코드 복사
COPY . .
# 프로젝트 빌드 (Spring Boot 프로젝트의 jar 파일 생성)
RUN ./gradlew bootJar --no-daemon -x test
# 2단계: 실행 단계
FROM openjdk:17-slim
# 환경 변수 설정 (필요 시 PORT 환경 변수 설정)
ENV PORT=8080
# app.jar로 jar 파일 복사
COPY --from=builder /app/build/libs/*.jar /app/app.jar
# 컨테이너 시작 시 실행할 명령어 설정
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
# Spring Boot 기본 포트 (8080) 노출
EXPOSE 8080
깃헙 액션 파일 작성(deploy.yml)
.github/workflows/deploy.yml
name: Build, Push, and Deploy to EC2
on:
push:
branches:
- main
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Check out the code
uses: actions/checkout@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
run: |
docker build -t ${{ secrets.DOCKER_USERNAME }}/spring-app:latest .
docker push ${{ secrets.DOCKER_USERNAME }}/spring-app:latest
deploy:
needs: build-and-push
runs-on: ubuntu-latest
steps:
- name: Deploy to EC2 with Docker Compose
uses: appleboy/ssh-action@v0.1.8
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd /home/${{ secrets.EC2_USER }}
docker-compose pull
docker-compose down
docker-compose up -d
Github Secrects 설정
GitHub Actions에서 사용하는 민감한 정보나 환경 변수를 저장
도커 관련 설정
- 도커 아이디
- 도커 패스워드 or 토큰(권장)
AWS EC2 관련 설정
- {EC2유저}@{EC2주소}
- EC2 접속 .pem 키

application.yml파일 처리는 어떻게..?
1. 환경변수 처리
2. .gitignore 처리
나는 1번 방식을 사용해서 진행
spring:
datasource:
url: ${SPRING_DATASOURCE_URL}
username: ${SPRING_DATASOURCE_USERNAME}
password: ${SPRING_DATASOURCE_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
sql:
init:
mode: always
server:
port: ${PORT}
logging:
level:
root: info
org.springframework.web: debug
jwt:
secret: ${JWT_SECRET}
expiration: ${JWT_EXPIRATION}
1번 방식으로 진행을 하면 github action을 사용히려면 환경 변수 처리한게 깃헙 시크릿 변수로 지정을 해야 빌드를 할 수 있음
그리고 ec2에 환경 변수 파일을 .env를 올려야 실행 가능함