CMD와 ENTRYPOINT에 JSON 형식 미사용

CMD와 ENTRYPOINT의 명령·인자를 명확히 지정하고 종료 신호 처리를 확인하세요.

설명

CMD와 ENTRYPOINT를 JSON 배열 형식으로 작성하지 않으면 셸을 거쳐 실행되면서 인자 해석 방식이 달라질 수 있습니다. 이 경우 종료 신호 전달이나 프로세스 제어가 기대와 다르게 동작할 수 있습니다.

컨테이너는 보통 하나의 메인 프로세스를 안정적으로 실행하고 종료해야 합니다. 그래서 직접 실행할 명령과 인자를 JSON 배열로 명확하게 지정하는 편이 좋습니다. 셸 기능이 꼭 필요하면 이를 명시적으로 사용하고 최종 프로세스에 신호가 전달되는지 확인하세요.

잠재적 영향

  • 프로세스 종료 신호가 제대로 전달되지 않을 수 있습니다.
  • 인자 해석이 달라져 실행 결과가 예기치 않게 바뀔 수 있습니다.
  • 컨테이너 종료나 재시작 시 운영 문제가 생길 수 있습니다.

해결 방법

  • CMD ["python", "/app/app.py"]처럼 JSON 배열 형식을 사용하세요.
  • ENTRYPOINT도 같은 방식으로 명시해 셸 의존성을 줄이세요.
  • 기존 Dockerfile에서 문자열 기반 실행 문법이 남아 있는지 점검하세요.

예시

top -b를 지원하는 Linux 이미지의 발췌입니다. exec 형식의 CMD는 ENTRYPOINT 뒤에 기본 인자로 추가됩니다.

변경 전

dockerfile
CMD [-b]
ENTRYPOINT [top]

변경 후

dockerfile
CMD ["-b"]
ENTRYPOINT ["top"]

설명:

  • 변경 전: 따옴표 없는 배열은 유효한 JSON이 아니므로 의도한 exec 형식으로 실행되지 않습니다.
  • 변경 후: JSON 배열로 top -b를 직접 실행합니다. 실제 애플리케이션에서도 종료 신호 처리와 정상 종료를 시험하세요.

참조