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 개념과 사용하는 이유
devron
devron
개발자 Ron이 AI 트렌드, 바이브코딩, 직장인 AI 활용법을 실험하고 기록하는 공간입니다.
  • devron
    Ron on AI
    devron
  • 전체
    오늘
    어제
    • 분류 전체보기 (107)
      • k8s (1)
      • AWS (1)
      • 리눅스 (4)
      • 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)
      • AI (0)
      • AI 트렌드 (7)
        • AI Agent (1)
        • AI 활용법 (5)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    기초
    프로그래머스
    바이브코딩
    배열
    nestjs
    AI프롬프트
    네트워크
    개발자
    PlanMode
    Til
    리눅스
    chatgpt활용
    typescript
    컨테이너
    mysql
    typeorm
    ai코딩
    스택
    Python
    javascript
    생활코딩
    레벨2
    모듈
    프롬프트엔지니어링
    Linux
    Docker
    Kubernetes
    자바스크립트
    django
    FastAPI
  • 최근 댓글

  • 최근 글

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

티스토리툴바