RUN, CMD, ENTRYPOINT 명령어 개념과 차이점

2022. 11. 9. 20:32·Docker

Dockerfile 작성 시 사용되는 명령문 중 실행과 관련된 명령어는 RUN, CMD, ENTRYPOINT 가 있습니다.

RUN

RUN 명령문은 쉘(shell)에서 커맨드를 실행하는 것처럼 이미지 빌드 과정에서 필요한 커맨드를 실행하기 위해 사용됩니다.

보통 이미지 안에 특정 소프트웨어를 설치하기 위해 많이 사용됩니다.

FROM node:16

RUN mkdir -p /app
WORKDIR /app
COPY package*.json ./

# local machine 에서 npm install 실행
RUN npm install

실행 시점 : 도커 이미지 빌드

ENTRYPOINT

ENTRYPOINT 명령문은 CMD 명령문과 비슷하지만, 컨테이너를 띄울 때 항상 실행되어야 하는 커맨드를 지정할 때 사용합니다.

Docker 이미지를 하나의 실행 파일처럼 사용할 때 매우 유용합니다.

그 이유는 컨테이너가 실행될 때 ENTRYPOINT 명령문으로 지정된 커맨드가 실행되고, 이 커맨드로 실행된 프로세스가 죽으면 컨테이너도 함께 종료되기 때문입니다.

# 예시) ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]

# Express 서버 실행 예제
CMD [ "node", "app.js" ]

실행 시점 : 컨테이너 실행

CMD

CMD 명령어는 도커 이미지를 컨테이너로 띄울 때 Default로 실행할 커맨드나, ENTRYPOINT 명령문으로 지정된 커맨드에 디폴트로 넘길 파라미터를 지정할 때 사용합니다.

예를 들어 아래와 같이 Dockerfile 을 작성합니다.

ENTRYPOINT ["node"]
CMD ["app.js"]

docker run 명령어로 인자 없이 실행하게 되면 CMD 명령문에 정의된 "app.js" 가 실행됩니다.

 

node app.js 실행

docker run testnode

node src/bin/www.js 실행

docker run testnode src/bin/www.js

파라미터로 src/bin/www.js 를 입력하게 되면 Dockerfile에 정의된 node.js 가 아닌 입력 파라미터를 실행하게 됩니다.

CMD 와 ENTRYPOINT 의 차이점

컨테이너 실행 시 CMD 명령문은 파라미터 입력이 없을 경우 정의된 파라미터가 실행되며, 상황에 따라 파라미터 추가 입력 시 입력 파라미터가 우선순위를 갖게 됩니다.
하지만, ENTRYPOINT의 경우 컨테이너 실행 시 항상 실행되기 때문에 Default 실행 명령어를 사용할 때 유용합니다.

정리하자면,

CMD : 입력 파라미터 존재 여부에 따라 실행 여부가 결정됩니다.
ENTRYPOINT : 항상 실행됩니다.

'Docker' 카테고리의 다른 글

로컬에서 Docker 를 이용한 Express 서버 어플리케이션 개발  (0) 2022.12.01
도커 컨테이너 환경변수 주입  (0) 2022.11.10
계속해서 restart 상태인 컨테이너 디버깅하기  (0) 2022.11.10
[Error] unable to start container process: exec: "bash"  (0) 2022.11.10
Docker Compose 개념과 사용하는 이유  (0) 2022.11.09
'Docker' 카테고리의 다른 글
  • 도커 컨테이너 환경변수 주입
  • 계속해서 restart 상태인 컨테이너 디버깅하기
  • [Error] unable to start container process: exec: "bash"
  • Docker Compose 개념과 사용하는 이유
rondeveloper
rondeveloper
  • rondeveloper
    Ron's learning record
    rondeveloper
  • 전체
    오늘
    어제
    • 분류 전체보기 (99) N
      • k8s (1) N
      • AWS (1)
      • 리눅스 (3)
      • Docker (8)
      • 라이브러리 & 프레임워크 (14)
        • React (2)
        • NestJS (8)
        • Spring (0)
        • Django (3)
        • FastAPI (1)
      • 웹 (2)
        • Nginx (1)
      • 프로그래밍 언어 (29)
        • HTML (0)
        • CSS (0)
        • JavaScript (21)
        • Python (3)
        • Node.js (0)
        • TypeScript (4)
        • Java (1)
      • Today I learned (9)
      • 알고리즘 (9)
        • 백준 (0)
        • 프로그래머스 (8)
        • 개념 (1)
      • 티끌모아 태산 (5)
        • 하루에 영단어 하나씩 (5)
        • 독서 (0)
      • 시행착오 (3)
      • 데이터베이스 (2)
        • MySQL (0)
      • 컴퓨터 과학 (8)
        • 네트워크 (2)
        • 운영체제 (0)
        • 데이터베이스 (2)
        • 자료구조 (4)
      • 포트폴리오 (4)
        • JJINCAFE IN SEOUL (4)
        • CODEUNICORN (0)
      • 회고 (0)
      • CICD (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    redis
    코딩테스트
    조인
    생활코딩
    IP 주소
    컨테이너
    Python
    javascript
    도커
    django
    typescript
    iterable
    기초
    Kubectl
    쿠버네티스
    모듈
    리눅스
    FastAPI
    배열
    스택
    Kubernetes
    nestjs
    typeorm
    네트워크
    mysql
    Docker
    레벨2
    자바스크립트
    프로그래머스
    Til
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
rondeveloper
RUN, CMD, ENTRYPOINT 명령어 개념과 차이점
상단으로

티스토리툴바