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 | 컨테이너 실행 시 반드시 실행될 명령 설정 | 컨테이너 실행 시 |
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.12.08 - Dockerfile : ARG 명령어 알아보기 (0) | 2024.12.08 |
---|---|
[TIL, 일일 회고] 2024.12.07 - 스냅샷(Snapshot)이란? (0) | 2024.12.07 |
[TIL, 일일 회고] 2024.12.05 - Dockerfile의 WORKDIR 알아보기 (0) | 2024.12.05 |
[TIL, 일일 회고] 2024.12.04 - JIT 컴파일러를 통한 자바의 성능 최적화 (0) | 2024.12.04 |
[TIL, 일일 회고] 2024.12.03 - BufferedReader 사용 시 예외처리가 필요한 이유 (IOException, throws) (0) | 2024.12.03 |