Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 21 additions & 4 deletions slackjudge/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,9 +1,26 @@
# Java 17
FROM eclipse-temurin:17-jre
# Build stage
FROM eclipse-temurin:17-jdk AS builder

WORKDIR /app

# Gradle wrapper 복사
COPY gradlew .

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

빌드 컨텍스트에 불필요한 파일(예: .gradle, build, IDE 설정 파일)이 포함되지 않도록 프로젝트 루트에 .dockerignore 파일을 추가하는 것을 강력히 권장합니다. 이렇게 하면 도커 이미지 빌드 시 불필요한 파일들이 Docker 데몬으로 전송되는 것을 막아 빌드 속도를 높이고, 로컬 빌드 결과물이 이미지에 포함되는 것을 방지하여 보다 깔끔하고 예측 가능한 빌드를 보장할 수 있습니다.

예시 .dockerignore 파일 내용입니다:

.gradle
build

# IDE files
.idea
*.iml

COPY gradle gradle
RUN chmod +x gradlew

# 의존성 캐싱을 위해 build 파일 먼저 복사
COPY build.gradle settings.gradle ./
RUN ./gradlew dependencies --no-daemon

# 소스 복사 및 빌드
COPY src src
RUN ./gradlew bootJar --no-daemon

# Run stage
FROM eclipse-temurin:17-jre

WORKDIR /app

COPY build/libs/batch-0.0.1-SNAPSHOT.jar app.jar
COPY --from=builder /app/build/libs/*.jar app.jar

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

와일드카드(*.jar)를 사용하여 JAR 파일을 복사하는 것은 버전 변경 시 Dockerfile을 수정할 필요가 없어 편리합니다. 하지만 build/libs 디렉토리에 의도치 않은 JAR 파일이 생성될 경우, 잘못된 파일이 복사될 위험이 있습니다. 현재 구조에서는 문제가 될 가능성이 낮지만, 이러한 트레이드오프를 인지하고 계시는 것이 좋습니다. 더 안전한 대안으로는, 빌드된 JAR 파일의 이름을 예측 가능하게 고정하거나(예: app.jar로 바로 빌드) CI/CD 파이프라인에서 파일명을 동적으로 주입하는 방법이 있습니다.


ENTRYPOINT ["java","-jar","app.jar"]
ENTRYPOINT ["java", "-jar", "app.jar"]
58 changes: 58 additions & 0 deletions slackjudge/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
services:
batch:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

batch 서비스는 postgresmongodb에 의존합니다. docker-compose는 서비스 간의 시작 순서를 보장하지 않기 때문에, batch 컨테이너가 데이터베이스 컨테이너보다 먼저 시작되어 연결 오류를 일으킬 수 있습니다. depends_onhealthcheck를 함께 사용하여 데이터베이스가 완전히 준비된 후에 batch 서비스가 시작되도록 보장해야 합니다. batch 서비스에 아래와 같이 depends_on 설정을 추가해주세요.

  batch:
    build: .
    depends_on:
      postgres:
        condition: service_healthy
      mongodb:
        condition: service_healthy
    ...

build: .
env_file:
- path: .env
required: false
environment:
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-local}
POSTGRES_HOST: ${POSTGRES_HOST:-postgres}
POSTGRES_PORT: ${POSTGRES_PORT:-5432}
POSTGRES_DATABASE: ${POSTGRES_DATABASE:-app}
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
MONGO_URI: ${MONGO_URI:-mongodb://mongo:mongo@mongodb:27017}
MONGO_DATABASE: ${MONGO_DATABASE:-app}
MONGO_USER_NAME: ${MONGO_USER_NAME:-mongo}
MONGO_PASSWORD: ${MONGO_PASSWORD:-mongo}
SLACK_WEBHOOK_URL: ${SLACK_WEBHOOK_URL:-}
entrypoint: ["/bin/sh", "-c", "java -jar app.jar $(date -u +'%Y-%m-%dT%H:%M:%SZ')"]

# 로컬 DB 컨테이너 (--profile local 옵션 사용 시에만 실행)
postgres:
profiles: [local]
image: postgres:17
ports:
- "5432:5432"
environment:
POSTGRES_DB: app
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
Comment on lines +27 to +30

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

postgres 서비스의 환경 변수(POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD)가 하드코딩되어 있습니다. batch 서비스에서는 환경 변수와 기본값을 사용하는 좋은 패턴을 적용하셨는데, postgres 서비스에도 동일한 방식을 적용하여 일관성을 유지하고 .env 파일을 통한 설정 변경을 용이하게 하는 것이 좋습니다.

    environment:
      POSTGRES_DB: ${POSTGRES_DATABASE:-app}
      POSTGRES_USER: ${POSTGRES_USER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}

volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5

mongodb:
profiles: [local]
image: mongo:8.0
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: mongo
MONGO_INITDB_ROOT_PASSWORD: mongo
MONGO_INITDB_DATABASE: app
Comment on lines +44 to +47

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

mongodb 서비스의 환경 변수(MONGO_INITDB_ROOT_USERNAME 등)가 하드코딩되어 있습니다. postgres 서비스와 마찬가지로, batch 서비스에서 사용하는 변수를 참조하도록 변경하여 일관성을 높이고 중앙에서 설정을 관리하기 용이하게 만드는 것이 좋습니다.

    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER_NAME:-mongo}
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD:-mongo}
      MONGO_INITDB_DATABASE: ${MONGO_DATABASE:-app}

volumes:
- mongodb_data:/data/db
healthcheck:
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
interval: 10s
timeout: 5s
retries: 5

volumes:
postgres_data:
mongodb_data: