728x90

개요

Docker를 사용하면서 가장 혼동되는 부분 중 하나가 RUN, CMD, ENTRYPOINT 명령어의 차이점입니다. 이 세 명령어는 모두 컨테이너와 관련된 명령을 실행하지만, 각각의 용도실행 시점다릅니다. 이번 글에서는 각 명령어의 특징과 사용 사례를 자세히 알아보겠습니다.

 

RUN 

RUN ./gradlew :payment:clean :payment:build -x test --no-daemon
  • 이미지 빌드 단계에서 실행되는 명령어
  • 새로운 레이어를 생성하여 이미지에 포함
  • 패키지 설치, 파일 복사 등 이미지 생성을 위한 준비 작업에 사용

CMD

# JAR 파일 실행
CMD ["java", "-jar", "/app.jar"]
  • 컨테이너 시작 실행되는 기본 명령어
  • docker run 실행 시 덮어쓸 수 있음
  • Spring Boot JAR 실행 옵션 지정에 유용

ENTRYPOINT

ENTRYPOINT ["java", "-jar", "build/libs/app.jar"]
  • 컨테이너 시작 시 반드시 실행되는 명령어
  • CMD와 조합하여 유연한 실행 옵션 구성 가능
  • 실행 스크립트를 통한 초기화 작업 수행

ENTRYPOINT와 CMD 함께 사용하기

ENTRYPOINT와 CMD는 이 둘은 각자의 역할을 가지면서도 함께 조합하여 사용하면 보다 유연하고 강력한 실행 환경을 구성할 수 있습니다.

 

ENTRYPOINT는 컨테이너가 실행될 때 반드시 실행되어야 하는 고정된 명령어를 정의하고, CMD는 그 명령어에 전달될 기본 인수를 설정하는 데 사용됩니다. 이러한 조합은 특히 Spring Boot와 같은 애플리케이션에서 실행 환경(예: 프로파일)을 동적으로 설정해야 할 때 매우 유용합니다.

ENTRYPOINT ["java", "-jar", "app.jar"]
CMD ["--spring.profiles.active=dev"]

 

  • ENTRYPOINT는 반드시 실행될 명령어를 정의
  • CMD는 ENTRYPOINT에 전달될 기본 파라미터 정의
  • docker run 실행 시 CMD 부분만 오버라이드 가능
# 기본 실행 (dev 프로파일)
docker run my-app
# 실제 실행되는 명령: java -jar app.jar --spring.profiles.active=dev

# prod 프로파일로 오버라이드
docker run my-app --spring.profiles.active=prod
# 실제 실행되는 명령: java -jar app.jar --spring.profiles.active=prod

 


명령어 Dockerfile에서 역할 실행 시점
RUN 애플리케이션 빌드 및 의존성 설치 이미지 빌드 시
CMD 컨테이너 실행 시 기본 실행 명령 설정 컨테이너 실행 시
ENTRYPOINT 컨테이너 실행 시 반드시 실행될 명령 설정 컨테이너 실행 시