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 : 항상 실행됩니다.

복사했습니다!