📌 Docker file CMD
📖 시나리오
Docker Image로 ubuntu 컨테이너 운용
$ docker run ubuntu
$ docker ps
- 위 명령어로 실행중인 컨테이너를 출력시 아무것도 보이지 않는다
$ docker ps -a
❓why
- 가상 컴퓨터와 달리 컨테이너는 OS를 호스팅하도록 되어 있지 않다
- 컨테이너는 특정 작업이나 프로세스를 실행한다(웹 서버, 응용 프로그램 서버, 데이터베이스 인스턴스 호스팅, 연산 또는 분석 수행 등등)
- 작업을 마치면 컨테이너를 빠져나온다
- 컨테이너는 그 안의 과정이 살아 있어야만 살 수 있다!
- 컨테이너 안의 웹 서비스가 멈추거나 충돌하면 컨테이너는 종료
⚙️ 컨테이너 안에서 실행되는 프로세스는 누가 정의하는가?

👆🏻 Dockerfile 의 CMD 필드에 주목
- 명령을 뜻하는데 프로그램을 정의 : 시작되면 컨테이너 안에서 실행될 명령
NGINX는 NGINX의 명령어
- MySQL 이미지는
mysqld
➡️ Ubuntu Docker file

- 위에서 하려고 했던건 Ubuntu 운영 체제로 컨테이너를 실행하는 것
- 기본 명령으로(CMD 부분 참고) [“bash”]를 사용함
bash는 웹 서버나 DB 서버 같은 프로세스는 아님
- 터미널의 인풋을 listen 하는 shell > 터미널을 못 찾으면 빠져나오게 됨
- 때문에 기본값으로 Docker는 실행 중일때 컨테이너에 터미널을 연결하지 않음
bash 프로그램은 터미널을 찾지 못해 종료됨
💡 How to config CMD
- Docker run 명령어에 CMD 추가하기
=> 이미지에 지정된 기본 명령을 재정의
$ docker run ubuntu [COMMAND]
$ docker run ubuntu sleep 5
- 위 예시는 컨테이너가 작동할때 sleep 5 를 실행하여 5초 기다렸다가 종료
이를 영구적으로 만들기 위해서는? 👉 컨테이너 시작시 sleep 명령어를 항상 실행하는 이미지를 만든다

- shell command 방식이나 JSON 배열 포멧으로 입력하여 이미지에 CMD 필드를 작성한다.
- JSON 방식으로 작성시 배열의 첫 번째 인덱스가 실행 가능 해야한다
- JSON 방식으로 작성시 명령과 파라미터(매개변수)를 같이 입력하지 말것
- 위 사진 처럼 작성 후 빌드 하여 실행하면 늘 5초만 sleep 하는 ubuntu 이미지를 만들 수 있다.
🔨 Change Parameter
$ docker run ubuntu-sleeper sleep 10
- ubuntu-sleeper 라는 이미지는 이미
sleep 5명령을 가지고 있다- Dockerfile을 정의할때 CMD가 아닌 ENTRYPOINT 필드를 작성한다

ENTRYPOINT 가 컨테이너가 실행되고 수행할 명령을 의미함
- 때문에
docker run ubuntu-sleeper 10 명령어 작동시 10초 슬립 후 종료됨
- 이것이
CMD와 ENTRYPOINT의 차이이다.
CMD의 지시사항에 따라 매개변수를 변경할 수 없다
🤪 매개변수 없이 ubuntu-sleeper 이미지를 실행하면?
- 에러가 발생
- default 값을 명시해주어야함
CMD와 ENTRYPOINT를 모두 사용

- 이 경우 매개변수를 지정하지 않았다면 5초 슬립한다!
- 이렇게 구현 하기 위해 항상
ENTRYPOINT와 CMD를 JSON 배열 포멧으로 명시해야함
🏃🏻 런타임(실행중인) 동안 매개변수를 수정 하려면?
- 위 사진대로 명령어를 실행
ENTRYPOINT를 하나 더 생성하고 다른 매개변수를 전달