도커에서는 명령어와 인자 정의를 위해 ENTRYPOINT와 CMD라는 명령어들을 지원해준다.
컨테이너를 실행할 때 실행되어야 하는 명령어 지정
ENTRYPOINT에 전달되어야 하는 인자 지정
따라서 도커에서 명령어와 인자 정의를 하는 올바른 방법은 아래와 같다.
ENTRYPOINT로 항상 명령어를 실행하도록 정의하고 추가 인자 설정이 필요한 경우에만 CMD를 사용한다.
# Shell 형식
ENTRYPOINT node app.js
# Exec 형식
ENTRYPOINT ["node", "app.js"]
결론만 말하면 Exec 형식을 사용하는게 좋다.
왜냐하면 결과는 동일한데 Shell 형식은 하나의 프로세스가 더 생기기 때문이다.
Shell 형식으로 실행하면 메인 프로세스가 Shell이 되기 때문에 아래처럼 불필요한 프로세스가 생긴다.
# Shell 방식으로 실행한 결과
PID TTY STAT TIME COMMAND
1 ? Ss ... /bin/sh -c node app.js # 불필요한 쉘 띄워짐.
7 ? Sl ... node app.js
PID TTY STAT TIME COMMAND
1 ? Sl ... node app.js