운영체제를 컨테이너화 시킬 때 바로 종료되는 구체적인 이유

  • ubuntu와 같이 운영체제를 컨테이너화 시키면 바로 종료된다는 사실은 이미 당연하다.
  • 이는 ubuntu의 도커파일을 보면 명확히 알 수 있는데 ubuntu의 도커파일은 마지막에 CMD로 bash 서비스를 실행한다.
  • 하지만 도커는 기본적으로 터미널을 할당하지 않으므로 서비스를 시작할 수 없어 바로 종료되는 것이다.
  • 따라서 -t 옵션을 같이 주면 종료되지 않는 것을 볼 수 있다.
  • 뒤에 명령어를 줬을 때 컨테이너가 바로 종료되지 않은 것은 뒤에 명령어가 기존의 이미지에 설정된 명령어를 덮어쓰기 때문이다. 따라서 bash라는 명령어는 실행되지 않는다.

CMD, Entrypoint 공통점 : 컨테이너가 수행하게 될 실행 명령을 정의하는 선언문이다.

 

CMD, Entrypoint 차이점 : CMD의 경우 run 뒤에 명령문을 넣으면 해당 명령문으로 대체되지만, Entrypoint의 경우 대체되지 않고 Entrypoint의 인자로 다 들어가게 된다.

  • 이때 inspect로 컨테이너를 보면 run 뒤에 준 인자는 CMD에 들어가는 것을 볼 수 있다. (만약 CMD에 이미 값을 지정했을 땐 덮어씌워진다.)
  • 즉, CMD에 있는 값이 결국 Entrypoint에 붙여지는 것이다. 따라서 기본값을 주고 싶을 땐 CMD에 값을 주면 지정해주고, 다른 값을 넣어줄 거면 docker run ubuntu-sleeper sleep 10와 같이 함으로써 CMD의 값이 10으로 덮어씌워지도록 한다. 
CMD ["5"] //기본값 설정
ENTRYPOINT ["sleep"]

docker run ubuntu-sleeper // 5초 동안 sleep 실행
=> command : sleep 5
docker run ubuntu-sleeper 10 // 10초 동안 sleep 실행
=> command : sleep 10
CMD와 Entrypoint 모두 쉘 형식보다는 JSON 배열 형식을 사용하자. 이 때 실행할 명령어는 무조건 하나이어야 한다. 따라서 뒤에 나오는 것들은 모두 인자로 취급된다.
ex) CMD ["sleep", "5"] 실행할 명령어와 인자는 따로따로 두어야 한다.

'Infra > Docker' 카테고리의 다른 글

Docker Engine  (0) 2024.09.12
Docker Compose  (0) 2024.09.11
환경 변수 설정  (0) 2024.09.10
이미지 생성  (0) 2024.09.10
Docker run 옵션  (0) 2024.09.10

+ Recent posts