개요
CMD와 ENTRYPOINT는 컨테이너가 시작될 때 실행되는 명령을 정의하는 Dockerfile 명령어 입니다. 이 두 명령어는 함께 작동하기 때문에 이해하기 어렵습니다. 이번 문서를 통해서 CMD와 ENTRYPOINT가 무엇이고 어떤 차이가 있는지 알아봅시다.
ENTRYPOINT & CMD 작동원리
ENTRYPOINT 명령어는 컨테이너가 시작될 때 실행되는 프로세스를 설정합니다.
CMD 명령어는 프로세스에 전달되는 기본 인수를 설정합니다.
ENTRYPOINT ["/usr/bin/my-app"]
CMD ["help"]
이미지에는 ENTRYPOINT가 하나만 있을 수 있습니다.
만약 ENTRYPOINT를 정의하지 않는다면 /bin/sh -c를 사용하게 됩니다.
Docker Container Run 작동원리
다음 명령어는 지정된 이미지를 사용하여 새 컨테이너를 실행합니다.
추가 인수가 없다면 실행되는 프로세스는 이미지에 정의된 ENTRYPOINT & CMD와 정확히 일치합니다.
Dockerfile
ENTRYPOINT ["/usr/bin/my-app"] CMD ["help"]
Docker CLI
docker run <image_name>:<tag> # Executes # /usr/bin/my-app help
같은 Dockerfile에 대해서 추가 인수를 전달하여 CMD를 재정의 할 수 있습니다.
Dockerfile : 동일
Docker CLI
docker run <image_name>:<tag> version # Executes # /usr/bin/my-app version
동일한 경우에 --entrypoint 옵션을 사용해서 ENTRYPOINT를 재정의할 수 있습니다.
이미지 파일 시스템의 내용을 검사하는 등의 컨테이너 내부의 셸을 시작하려는 경우에 유용합니다.
Dockerfile : 동일
Docker CLI
docker run --entrrypoint bash <image_name>:<tag> -c "ls /"
ENTRYPOINT와 CMD 차이점
ENTRYPOINT는 명령을 정의하고 CMD는 인수를 정의합니다.
기존에 ENTRYPOINT 혹은 CMD만을 사용하는 단일 명령을 제공하는 경우보다 ENTRYPOINT & CMD를 동시에 사용하면 Docker Container Image가 더욱 유연해집니다.
결론
ENTRYPOINT는 컨테이너 내부에서 실행될 프로세스의 경로입니다.
CMD는 해당 명령(있는 경우)에 전달할 기본 인수여야 합니다.