티스토리 뷰

🍀 Spring Boot

Dockerfile의 실행 시점

James Wetzel 2025. 1. 16. 15:11
728x90
반응형

Spring Boot 애플리케이션의 실행과 관련된 Dockerfile의 실행 시점은 Docker 컨테이너의 빌드실행 프로세스에서 각각 다릅니다. Dockerfile에 정의된 각 단계는 빌드 또는 실행 단계에서 실행됩니다. 아래에서 각각의 상황을 설명합니다.


1. Dockerfile의 실행 시점

A. 이미지 빌드 시점

Dockerfile의 명령어 중 RUN, COPY, ADD 등의 명령은 이미지 빌드 시점에 실행됩니다.
이 과정은 docker build 명령을 실행할 때 발생합니다.

예제:

# Dockerfile
FROM openjdk:17-jdk-slim

# 빌드 시 실행
COPY target/myapp.jar /app.jar
RUN apt-get update && apt-get install -y curl

# 실행 시 실행
CMD ["java", "-jar", "/app.jar"]
  • COPY와 RUN:
    • COPY target/myapp.jar /app.jar → 빌드 시 JAR 파일을 이미지에 복사.
    • RUN apt-get update && apt-get install -y curl → 빌드 시 의존성 설치.

B. 컨테이너 실행 시점

Dockerfile에서 CMD 또는 ENTRYPOINT에 정의된 명령어는 컨테이너 실행 시점에 실행됩니다.
이 과정은 docker run 명령을 실행할 때 발생합니다.

예제:

CMD ["java", "-jar", "/app.jar"]
  • 컨테이너 실행 시:
    • java -jar /app.jar 명령이 실행되어 Spring Boot 애플리케이션이 시작됩니다.

2. 실행 시점에 따라 나눠지는 Dockerfile 명령어

Dockerfile 명령어를 빌드 시점과 실행 시점으로 구분하면 다음과 같습니다:

빌드 시점

  • FROM: 베이스 이미지를 가져오는 단계.
  • COPY, ADD: 파일을 이미지에 복사하거나 추가하는 단계.
  • RUN: 이미지를 구성하는 데 필요한 추가 명령 실행 (의존성 설치 등).

실행 시점

  • CMD: 컨테이너 실행 시 기본 명령을 정의.
  • ENTRYPOINT: 컨테이너 실행 시 필수 명령을 정의 (주로 애플리케이션 실행).
  • ENV: 실행 시 사용될 환경 변수를 설정.

3. Spring Boot Dockerfile의 일반적인 실행 흐름

Spring Boot 애플리케이션을 위한 Dockerfile 작성과 실행 흐름을 예로 들어 설명합니다.

예제 Dockerfile

# Step 1: Use a base image
FROM openjdk:17-jdk-slim

# Step 2: Add metadata (optional)
LABEL maintainer="your_email@example.com"

# Step 3: Copy the JAR file
COPY target/myapp.jar /app.jar

# Step 4: Set environment variables (optional)
ENV SPRING_PROFILES_ACTIVE=prod

# Step 5: Set the default command to run the JAR
CMD ["java", "-jar", "/app.jar"]

실행 흐름

  1. 이미지 빌드 (docker build -t my-spring-app .):
    • 베이스 이미지를 가져옵니다.
    • target/myapp.jar 파일을 Docker 이미지에 복사합니다.
    • 필요한 의존성을 설치합니다 (RUN 명령어가 포함된 경우).
  2. 컨테이너 실행 (docker run -e SPRING_PROFILES_ACTIVE=dev my-spring-app):
    • Spring Boot 애플리케이션이 실행됩니다 (CMD에 정의된 명령 실행).

4. Dockerfile 실행 시점의 문제 해결

Spring Boot Dockerfile에서 실행 시점에 관련된 문제를 확인하려면 다음을 점검합니다:

A. 빌드 시점 문제

  • 빌드가 실패한다면:
    • 파일 경로가 올바른지 확인 (COPY, ADD).
    • RUN 명령어에 잘못된 명령이 포함되지 않았는지 점검.

B. 실행 시점 문제

  • 컨테이너 실행 시 Spring Boot 애플리케이션이 시작되지 않는다면:
    • CMD 또는 ENTRYPOINT에 올바른 명령이 포함되었는지 확인.
    • 환경 변수 (ENV 또는 -e 옵션) 설정을 점검.
    • 로그를 확인 (docker logs <container_id>).

5. Docker Compose와의 연동

Docker Compose를 사용하는 경우 docker-compose.yml의 설정도 컨테이너 실행 시점에 영향을 줍니다.

version: "3.8"
services:
  app:
    build:
      context: .
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod

요약

  • Dockerfile 빌드 시점: RUN, COPY, ADD 명령어 실행.
  • 컨테이너 실행 시점: CMD, ENTRYPOINT에 정의된 명령 실행.
  • Spring Boot 애플리케이션은 컨테이너 실행 시점에 java -jar 명령으로 시작됩니다.
  • 문제가 발생하면 빌드 단계와 실행 단계에서 각각 로그를 점검하여 원인을 파악하세요.

 


 


Dockerfile의 실행 프로세스를 단계별로 설명드리겠습니다:

1. **Build Phase**
   - 먼저 Spring Boot 프로젝트를 빌드하여 JAR 파일을 생성합니다.
   - `target/*.jar`에 생성된 JAR 파일이 위치하게 됩니다.

2. **Docker Image Creation**
   - `docker build` 명령어 실행 시 Dockerfile이 처리됩니다:
     - `FROM openjdk:21-jdk-slim`: JDK 21이 설치된 기본 이미지를 가져옵니다.
     - `ARG JAR_FILE=target/*.jar`: JAR 파일 위치를 변수로 정의합니다.
     - `ARG PROFILES`: 프로필 설정을 위한 변수를 정의합니다.
     - `COPY ${JAR_FILE} app.jar`: 빌드된 JAR 파일을 이미지 내부로 복사합니다.
     - `ENTRYPOINT`: 컨테이너 실행 시 사용될 명령어를 설정합니다.

3. **Container Runtime**
   - `docker run` 명령어 실행 시:
     - 컨테이너가 시작되며 ENTRYPOINT에 정의된 명령어가 실행됩니다.
     - `-Dspring.profiles.active=${PROFILES}`를 통해 지정된 프로필로 애플리케이션이 시작됩니다.
     - Spring Boot 애플리케이션이 구동됩니다.

실제 사용 예시:
```bash
# 이미지 빌드
docker build --build-arg PROFILES=dev -t myapp:latest .

# 컨테이너 실행
docker run -p 8080:8080 myapp:latest
```

이런 식으로 Dockerfile은 애플리케이션을 컨테이너화하는 전체 프로세스에서 핵심적인 역할을 하며, 빌드 시점과 런타임 시점에 각각 다른 방식으로 활용됩니다.

 

 

728x90
반응형